千家信息网

怎么使用Java多线程来实现简单的售票功能

发表于:2025-11-11 作者:千家信息网编辑
千家信息网最后更新 2025年11月11日,小编给大家分享一下怎么使用Java多线程来实现简单的售票功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!完整代码pack
千家信息网最后更新 2025年11月11日怎么使用Java多线程来实现简单的售票功能

小编给大家分享一下怎么使用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.Builder().url("http://localhost:8080/lock/unlock").build();        Call call = okHttpClient.newCall(request);        Response response = call.execute();    }    /**     * 卖票一张     */    private int saleOneTicket() throws IOException {        OkHttpClient 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(request);        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;    }}

以上是"怎么使用Java多线程来实现简单的售票功能"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

0