1. 程式人生 > >java多執行緒之Runnable同時執行同一資源例項

java多執行緒之Runnable同時執行同一資源例項

這是個賣票例項,採用多執行緒,模擬不同視窗來賣票,票數是共同資源。

piao.java

package tong;

public class piao implements Runnable {
    private static int count = 10;

    @Override

    public void run() {

        while (count > 0) {
            try {
                Thread.sleep(23);
            } catch (InterruptedException e) {
                
// TODO Auto-generated catch block e.printStackTrace(); } synchronized (this) { if (count > 0) { count--; System.out.println(Thread.currentThread().getName() + "賣出一張票,票還剩" + count); } } } } }

chuangkou.java

package tong;

public class chuangkou {
public static void main(String[] args) {
    piao piao =new piao();
    
    Thread thread1 =new Thread(piao,"視窗1");
    Thread thread2 =new Thread(piao,"視窗2");
    Thread thread3 =new Thread(piao,"視窗3");
    Thread thread4 =new Thread(piao,"視窗4");
    thread1.start();
    thread2.start();
    thread3.start();
    thread4.start();
}  
}

開啟四個視窗同時賣票,結果如下

視窗4賣出一張票,票還剩9
視窗1賣出一張票,票還剩8
視窗2賣出一張票,票還剩7
視窗3賣出一張票,票還剩6
視窗2賣出一張票,票還剩5
視窗1賣出一張票,票還剩4
視窗3賣出一張票,票還剩3
視窗4賣出一張票,票還剩2
視窗4賣出一張票,票還剩1
視窗1賣出一張票,票還剩0

多執行緒Runnable同時執行同一資源,必須考慮程式碼的原子性,對於初學者來說,執行緒訪問的隨機性,以及資源的分配有時分不清,初學者學一下java的原子性,可見性,有序性。就對這些問題清清楚楚了。

還有第一個程式piao.java,大家考慮兩個問題

第一:把if (count>0){}去掉的結果

視窗3賣出一張票,票還剩9
視窗2賣出一張票,票還剩8
視窗1賣出一張票,票還剩7
視窗4賣出一張票,票還剩6
視窗4賣出一張票,票還剩5
視窗3賣出一張票,票還剩4
視窗2賣出一張票,票還剩3
視窗1賣出一張票,票還剩2
視窗3賣出一張票,票還剩1
視窗1賣出一張票,票還剩0
視窗2賣出一張票,票還剩-1
視窗4賣出一張票,票還剩-2
視窗3賣出一張票,票還剩-3

這個是思考執行緒的控制

第二:保持第一步。然後把synchronized改成把while(count>0)括住

視窗1賣出一張票,票還剩9
視窗1賣出一張票,票還剩8
視窗1賣出一張票,票還剩7
視窗1賣出一張票,票還剩6
視窗1賣出一張票,票還剩5
視窗1賣出一張票,票還剩4
視窗1賣出一張票,票還剩3
視窗1賣出一張票,票還剩2
視窗1賣出一張票,票還剩1
視窗1賣出一張票,票還剩0

這個是思考原子性的範圍