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

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

 更新時間:2021年04月25日 10:03:28   作者:喬 三石  
這篇文章主要介紹了Java多線程之簡單模擬售票功能,文中有非常詳細的代碼示例,對正在學習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)是默認是打開狀態(tài)
            //獲取鎖的狀態(tài)
            int lockStatus = this.findLockStatus();
            if (lockStatus == 0) {
                //修改鎖的狀態(tài) =>>鎖定
                this.locked();
                //獲取總票數
                int tickets = this.findTickets();
                //剩余票數
                int i = this.remainVotes();
                //判斷票數
                if (tickets < 1) {
                    //已售賣完 跳出循環(huán)
                    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;
    }

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


    /**
     * 查看總票數
     *
     * @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;

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

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

    /**
     * 查看總票數
     */
    @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(上鎖),避免多個線程同時獲取鎖的狀態(tài)都為0(未上鎖),從而導致線程安全問題
        lockStatus = 1;
        return lockStatus;
    }

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

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

        return tickets;
    }

}

三、流程圖解析

在這里插入圖片描述

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

相關文章

  • hashtable桶數通常會取一個素數分析

    hashtable桶數通常會取一個素數分析

    這篇文章主要介紹了hashtable桶數通常會取一個素數分析的相關資料,需要的朋友可以參考下
    2016-12-12
  • SpringBoot實現短信發(fā)送及手機驗證碼登錄

    SpringBoot實現短信發(fā)送及手機驗證碼登錄

    本文主要介紹了SpringBoot實現短信發(fā)送及手機驗證碼登錄,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • IDEA如何撤銷本地commit的代碼

    IDEA如何撤銷本地commit的代碼

    這篇文章主要介紹了IDEA如何撤銷本地commit的代碼問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 使用jdbcTemplate查詢返回自定義對象集合代碼示例

    使用jdbcTemplate查詢返回自定義對象集合代碼示例

    這篇文章主要介紹了使用jdbcTemplate查詢返回自定義對象集合代碼示例,分享了相關代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • Java基于socket編程相關知識解析

    Java基于socket編程相關知識解析

    這篇文章主要為大家詳細解析了Java基于socket編程的相關知識,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • maven混淆打包的實現步驟

    maven混淆打包的實現步驟

    本文主要介紹了maven混淆打包的實現步驟,包含了Maven項目混淆、瘦身、打包exe這幾個方面,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • 從Hello?World開始理解GraphQL背后處理及執(zhí)行過程

    從Hello?World開始理解GraphQL背后處理及執(zhí)行過程

    這篇文章主要為大家介紹了從Hello?World開始理解GraphQL背后處理過程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • SpringBoot集成shiro,MyRealm中無法@Autowired注入Service的問題

    SpringBoot集成shiro,MyRealm中無法@Autowired注入Service的問題

    今天小編就為大家分享一篇關于SpringBoot集成shiro,MyRealm中無法@Autowired注入Service的問題,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • springBoot配置國產達夢數據庫的示例詳解

    springBoot配置國產達夢數據庫的示例詳解

    本文向大家介紹springBoot?配置國產達夢數據庫的相關知識,文章結合示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • java 動態(tài)生成bean的案例

    java 動態(tài)生成bean的案例

    這篇文章主要介紹了java 動態(tài)生成bean的案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02

最新評論