欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java多線程之簡單模擬售票功能

 更新時(shí)間:2021年04月25日 10:03:28   作者:喬 三石  
這篇文章主要介紹了Java多線程之簡單模擬售票功能,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下

一、創(chuàng)建

在這里插入圖片描述

二、完整代碼

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 (; ; ) {
            //鎖的狀態(tài)是默認(rèn)是打開狀態(tài)
            //獲取鎖的狀態(tài)
            int lockStatus = this.findLockStatus();
            if (lockStatus == 0) {
                //修改鎖的狀態(tài) =>>鎖定
                this.locked();
                //獲取總票數(shù)
                int tickets = this.findTickets();
                //剩余票數(shù)
                int i = this.remainVotes();
                //判斷票數(shù)
                if (tickets < 1) {
                    //已售賣完 跳出循環(huán)
                    break;
                } else {
                    //賣一張票
                    int remainVotes = this.saleOneTicket();
                    System.out.println(this.getName() + "當(dāng)前的票數(shù):" + tickets);
                    System.out.println(this.getName() + "售票后:" + remainVotes);
                    //  釋放鎖
                    this.unlock();
                }
            }
        }


    }

    /**
     * 剩余票數(shù)
     *
     * @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;
    }

    /**
     * 獲取鎖的狀態(tài)
     */
    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;
    }

    /**
     * 修改鎖狀態(tài)
     */
    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;
    }


    /**
     * 查看總票數(shù)
     *
     * @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 {
    /**
     * 總票數(shù)
     */
    private static Integer tickets = 100;

    /**
     * 鎖的狀態(tài) 0:未鎖   1:鎖
     */
    private static Integer lockStatus = 0;

    /**
     * 賣票
     */
    @RequestMapping("/saleOneTicket")
    public Integer saleOneTicket() {
        return tickets = tickets - 1;
    }

    /**
     * 查看總票數(shù)
     */
    @RequestMapping("/findTickets")
    public Integer findTickets() {
        return tickets;
    }

    /**
     * 查看鎖的狀態(tài)
     */
    @RequestMapping("/findLock")
    public synchronized Integer findLock() {
        Integer lock=lockStatus;
        //改變鎖狀態(tài),使線程串行執(zhí)行
        this.locked();
        return lock;
    }

    /**
     * 改變鎖狀態(tài)
     */
    @RequestMapping("/locked")
    public synchronized int locked() {
        //更改鎖的狀態(tài)為1(上鎖),避免多個(gè)線程同時(shí)獲取鎖的狀態(tài)都為0(未上鎖),從而導(dǎo)致線程安全問題
        lockStatus = 1;
        return lockStatus;
    }

    /**
     * 釋放鎖
     */
    @RequestMapping("/unlock")
    public synchronized int unlock() {
        return lockStatus = 0;
    }

    /**
     * 剩余票數(shù)
     *
     * @return
     */
    @RequestMapping("/remainVotes")
    public int remainVotes() {

        return tickets;
    }

}

三、流程圖解析

在這里插入圖片描述

到此這篇關(guān)于Java多線程之簡單模擬售票功能的文章就介紹到這了,更多相關(guān)Java模擬售票功能內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論