国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

java多線程之火車售票系統模擬

2019-11-06 06:40:59
字體:
來源:轉載
供稿:網友

1.前言

為了學習多線程共享與通信,我們模擬一個火車售票系統,假設有10張火車票,三個窗口(也就是三個線程)同時進行售票。

2.非同步代碼

package com.tl.skyLine.thread;/** * Created by tl on 17/3/6. */public class SellTicket {    public static void main(String[] args) {        TicketWindow tw = new TicketWindow();        Thread t1 = new Thread(tw, "一號窗口");        Thread t2 = new Thread(tw, "二號窗口");        Thread t3 = new Thread(tw, "三號窗口");        t1.start();        t2.start();        t3.start();    }}class TicketWindow implements Runnable {    PRivate int tickets = 10;    @Override    public void run() {        while (true) {            if (tickets > 0) {                System.out.println("還剩余票:" + tickets + "張");                tickets--;                System.out.println(Thread.currentThread().getName() + "賣出一張火車票,還剩" + tickets + "張");            } else {                System.out.println("余票不足,暫停出售!");//                wait,notify和notifyAll只能在同步控制方法或者同步控制塊里面使用,而sleep可以在任何地方使用                try {                    Thread.sleep(1000 * 60 * 5);                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        }    }}打印結果:

還剩余票:10張還剩余票:10張還剩余票:10張二號窗口賣出一張火車票,還剩7張還剩余票:7張三號窗口賣出一張火車票,還剩8張一號窗口賣出一張火車票,還剩9張還剩余票:6張還剩余票:6張二號窗口賣出一張火車票,還剩6張還剩余票:4張三號窗口賣出一張火車票,還剩4張還剩余票:3張一號窗口賣出一張火車票,還剩5張三號窗口賣出一張火車票,還剩2張還剩余票:2張三號窗口賣出一張火車票,還剩1張還剩余票:1張三號窗口賣出一張火車票,還剩0張余票不足,暫停出售!二號窗口賣出一張火車票,還剩3張余票不足,暫停出售!還剩余票:2張一號窗口賣出一張火車票,還剩-1張余票不足,暫停出售!上面結果,可以清楚地看到,由于三個線程可以同時訪問一個任務,也就是售票任務,會出現火車票還剩-1張這種不合實際的問題,之所以出現是因為假設在某一瞬間,tickets為1時,tickets > 0為true,A線程運行到tickets--這一行代碼,此時還沒有減去1,同時另外一個線程B剛好運行到tickets > 0這一行代碼,判斷成功,開始執行賣票,此時A線程減去一張票,tickets=0,然后B線程又減去一張,則剩-1張。所以此時需要用到同步鎖synchronized。保證某一時刻只能有一個線程執行售票功能。

3.同步代碼

package com.tl.skyLine.thread;/** * Created by tl on 17/3/6. */public class SellTicket {    public static void main(String[] args) {        TicketWindow tw = new TicketWindow();        Thread t1 = new Thread(tw, "一號窗口");        Thread t2 = new Thread(tw, "二號窗口");        Thread t3 = new Thread(tw, "三號窗口");        t1.start();        t2.start();        t3.start();    }}class TicketWindow implements Runnable {    private int tickets = 10;    @Override    public synchronized void run() {        while (true) {            if (tickets > 0) {                System.out.println(Thread.currentThread().getName() + "準備出票,還剩余票:" + tickets + "張");                tickets--;                System.out.println(Thread.currentThread().getName() + "賣出一張火車票,還剩" + tickets + "張");            } else {                System.out.println("余票不足,暫停出售!");//                wait,notify和notifyAll只能在同步控制方法或者同步控制塊里面使用,而sleep可以在任何地方使用                try {                    Thread.sleep(1000 * 60 * 5);                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        }    }}

等同于:

class TicketWindow implements Runnable {                                                                                        private int tickets = 10;                                                                                                                                                                                                                               @Override                                                                                                                   public void run() {                                                                                                             while (true) {                                                                                                                  synchronized (this) {                                                                                                           if (tickets > 0) {                                                                                                              System.out.println(Thread.currentThread().getName() + "準備出票,還剩余票:" + tickets + "張");                                        tickets--;                                                                                                                  System.out.println(Thread.currentThread().getName() + "賣出一張火車票,還剩" + tickets + "張");                                    } else {                                                                                                                        System.out.println("余票不足,暫停出售!");                                                                       //                wait,notify和notifyAll只能在同步控制方法或者同步控制塊里面使用,而sleep可以在任何地方使用                                                                     try {                                                                                                                           Thread.sleep(1000 * 60 * 5);                                                                                            } catch (InterruptedException e) {                                                                                              e.printStackTrace();                                                                                                    }                                                                                                                       }                                                                                                                       }                                                                                                                       }                                                                                                                       }                                                                                                                       }                                                                                                                           

結果:

一號窗口準備出票,還剩余票:10張一號窗口賣出一張火車票,還剩9張一號窗口準備出票,還剩余票:9張一號窗口賣出一張火車票,還剩8張一號窗口準備出票,還剩余票:8張一號窗口賣出一張火車票,還剩7張一號窗口準備出票,還剩余票:7張一號窗口賣出一張火車票,還剩6張一號窗口準備出票,還剩余票:6張一號窗口賣出一張火車票,還剩5張一號窗口準備出票,還剩余票:5張一號窗口賣出一張火車票,還剩4張一號窗口準備出票,還剩余票:4張一號窗口賣出一張火車票,還剩3張一號窗口準備出票,還剩余票:3張一號窗口賣出一張火車票,還剩2張一號窗口準備出票,還剩余票:2張一號窗口賣出一張火車票,還剩1張一號窗口準備出票,還剩余票:1張一號窗口賣出一張火車票,還剩0張余票不足,暫停出售!

synchronized:

synchronized是java中的關鍵字,是一種同步鎖。它修飾的對象有以下幾種:1. 修飾一個代碼塊,被修飾的代碼塊稱為同步語句塊,其作用的范圍是大括號{}括起來的代碼,作用的對象是調用這個代碼塊的對象;2. 修飾一個方法,被修飾的方法稱為同步方法,其作用的范圍是整個方法,作用的對象是調用這個方法的對象;3. 修改一個靜態的方法,其作用的范圍是整個靜態方法,作用的對象是這個類的所有對象;4. 修改一個類,其作用的范圍是synchronized后面括號括起來的部分,作用主的對象是這個類的所有對象。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宣城市| 苗栗市| 东丰县| 平阳县| 内江市| 筠连县| 军事| 嘉黎县| 阜新市| 临颍县| 晋宁县| 永年县| 辉县市| 六枝特区| 沙河市| 石阡县| 揭东县| 公主岭市| 海林市| 泰顺县| 武汉市| 平陆县| 合水县| 调兵山市| 咸丰县| 阿勒泰市| 武穴市| 长武县| 阿拉善右旗| 江北区| 泾阳县| 黄石市| 铜山县| 定州市| 丽江市| 宁波市| 莱西市| 札达县| 米脂县| 米脂县| 甘肃省|