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小时内删除侵权内容。

上一篇:SpringBoot+Docker+IDEA实现一键构建+推送、运行、同镜像多容器启动
下一篇:微信健康码开放api接口(微信小程序健康码接口)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~