java怎么拦截某个对象
255
2023-01-20
Java多线程之简单模拟售票功能
一、创建
二、完整代码
package com.ql;
import lombok.SneakyThrows;
import okhttp3.Call;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
public class Mythread extends Thread {
public Mythread(String name) {
super(name);
}
@SneakyThrows
@Override
public void run() {
for (; ; ) {
//锁的状态是默认是打开状态
//获取锁的状态
int lockStatus = this.findLockStatus();
if (lockStatus == 0) {
//修改锁的状态 =>>锁定
this.locked();
//获取总票数
int tickets = this.findTickets();
//剩余票数
int i = this.remainVotes();
//判断票数
if (tickets < 1) {
//已售卖完 跳出循环
break;
} else {
//卖一张票
int remainVotes = this.saleOneTicket();
System.out.println(this.getName() + "当前的票数:" + tickets);
System.out.println(this.getName() + "售票后:" + remainVotes);
// 释放锁
this.unlock();
}
}
}
}
/**
* 剩余票数
*
* @return
* @throws IOException
*/
private int remainVotes() throws IOException, InterruptedException {
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder().url("http://localhost:8080/lock/remainVotes").build();
Call call = okHttpClient.newCall(request);
Response response = call.execute();
String string = response.body().string();
int ticketsVote = Integer.parseInt(string);
return ticketsVote;
}
/**
* 释放锁
*/
private void unlock() throws IOException {
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Bhttp://uilder().url("http://localhost:8080/lock/unlock").build();
Call call = okHttpClient.newCall(request);
Response response = call.execute();
}
/**
* 卖票一张
*/
private int saleOneTicket() throws IOException {
OkHttArLyklpXpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder().url("http://localhost:8080/lock/saleOneTicket").build();
Call call = okHttpClient.newCall(request);
Response response = call.execute();
String string = response.body().string();
int remainVotes = Integer.parseInt(string);
return remainVotes;
}
/**
* 获取锁的状态
*/
private int findLockStatus() throws IOException {
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder().url("http://localhost:8080/lock/findLock").build();
Call call = okHttpClient.newCall(request);
Response response = call.execute();
String string = response.body().string();
int lockStatus = Integer.parseInt(string);
return lockStatus;
}
/**
* 修改锁状态
*/
private int locked() throws IOException {
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder().url("http://localhost:8080/lock/locked").build();
Call call = okHttpClient.newCall(request);
Response response = call.execute();
String string = response.body().string();
int lockStatus = Integer.parseInt(string);
return lockStatus;
}
/**
* 查看总票数
*
* @throws IOException
*/
private int findTickets() throws IOException {
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder().url("http://localhost:8080/lock/findTickets").build();
Call call = okHttpClient.newCall(requesthttp://);
Response response = call.execute();
String string = response.body().string();
Integer tickets = Integer.parseInt(string);
return tickets;
}
}
package com.ql;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/lock")
public class ClientService {
/**
* 总票数
*/
private static Integer tickets = 100;
/**
* 锁的状态 0:未锁 1:锁
*/
private static Integer lockStatus = 0;
/**
* 卖票
*/
@RequestMapping("/saleOneTicket")
public Integer saleOneTicket() {
return tickets = tickets - 1;
}
/**
* 查看总票数
*/
@RequestMapping("/findTickets")
public Integer findTickets() {
return tickets;
}
/**
* 查看锁的状态
*/
@RequestMapping("/findLock")
public synchronized Integer findLock() {
Integer lock=lockStatus;
//改变锁状态,使线程串行执行
this.locked();
return lock;
}
/**
* 改变锁状态
*/
@RequestMapping("/locked")
public synchronized int locked() {
//更改锁的状态为1(上锁),避免多个线程同时获取锁的状态都为0(未上锁),从而导致线程安全问题
lockStatus = 1;
return lockStatus;
}
/**
* 释放锁
*/
@RequestMapping("/unlock")
public synchronized int unlock() {
return lockStatus = 0;
}
/**
* 剩余票数
*
* @return
*/
@RequestMapping("/remainVotes")
public int remainVotes() {
return tickets;
}
}
三、流程图解析
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~