Java多線程對同一個對象進行操作


示例:

三個窗口同時出售20張票。

程序分析:

1、票數要使用一個靜態的值。

2、為保證不會出現賣出同一張票,要使用同步鎖。

3、設計思路:創建一個站台類Station,繼承THread,重寫run方法,在run方法內部執行售票操作!

售票要使用同步鎖:即有一個站台賣這張票時,其他站台要等待這張票賣完才能繼續賣票!

package com.multi_thread;

//站台類
public class Station extends Thread {
    // 通過構造方法給線程名字賦值
    public Station(String name) {
        super(name);// 給線程起名字
    }

    // 為了保持票數的一直,票數要靜態
    static int tick = 20;
    // 創建一個靜態鑰匙
    static Object ob = "aa";// 值是任意的

    @Override
    public void run() {
        while (tick > 0) {
            // 這個很重要,必須使用一個鎖,進去的人會把鑰匙拿在手上,出來后把鑰匙讓出來
            synchronized (ob) {
                if (tick > 0) {
                    System.out.println(getName() + "賣出了第" + tick + "張票");
                    tick--;
                } else {
                    System.out.println("票賣完了");
                }
            }
            try {
                // 休息一秒鍾
                sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

}
package com.multi_thread;

public class MainClass {
    // java多線程同步所的使用
    // 三個售票窗口同時出售10張票
    public static void main(String[] args) {
        // 實例化站台對象,並為每一個站台取名字
        Station station1 = new Station("窗口1");
        Station station2 = new Station("窗口2");
        Station station3 = new Station("窗口3");
        // 讓每一個站台對象各自開始工作
        station1.start();
        station2.start();
        station3.start();
    }
}

程序運行結果:

窗口1賣出了第20張票
窗口3賣出了第19張票
窗口2賣出了第18張票
窗口2賣出了第17張票
窗口3賣出了第16張票
窗口1賣出了第15張票
窗口1賣出了第14張票
窗口3賣出了第13張票
窗口2賣出了第12張票
窗口1賣出了第11張票
窗口3賣出了第10張票
窗口2賣出了第9張票
窗口1賣出了第8張票
窗口3賣出了第7張票
窗口2賣出了第6張票
窗口1賣出了第5張票
窗口3賣出了第4張票
窗口2賣出了第3張票
窗口3賣出了第2張票
窗口1賣出了第1張票


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM