温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2022-02-24 14:27:44 来源:亿速云 阅读:157 作者:小新 栏目:开发技术

小编给大家分享一下怎么使用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多线程来实现简单的售票功能”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI