Thread是如何處理Runnable的

柴月和岐月發表於2017-01-03

 

靈感來源於Java中繼承thread類與實現Runnable介面的區別

看完之後突然想知道不同的Thread物件是如何共享runnable物件裡的資料的。

 

引數為Runnable物件的建構函式(當然,建構函式還有很多,我們就不一一說了)

 

public Thread(Runnable target) {
        init(null, target, "Thread-" + nextThreadNum(), 0);
    }

init()函式裡將runnable物件賦給target變數

 

 

private void init(ThreadGroup g, Runnable target, String name, long stackSize) {
	....................
        this.target = target;
        ....................
    }	....................
        this.target = target;
        ....................
    }

 

target變數只是一個普通的Runnable物件

 

private Runnable target;

 

呼叫start()方法後最終回到run()方法,在這裡呼叫runnable物件的run方法

 

public void run() {
        if (target != null) {
            target.run();
        }
    }

 

 

所以得到的結論是:不同的thread物件都持有對同一個runnable物件的引用,所以相當於共享變數

那假如構造Thread的時候傳入Runnable物件,又重寫run()方法會怎麼樣呢?

 

假如是完全重寫的話,那麼你的runnable物件就相當於白傳了,裡面的run()方法不會被呼叫。

但假如是super.run()呢?

不多說,上程式碼和結果

 

Thread t1 = new Thread(mt, "一號視窗"){
			private int num=0;
			@Override
			public void run() {
				super.run();
				num++;
				System.out.println("一號視窗賣完了");
			}
		};
		Thread t2 = new Thread(mt, "二號視窗"){
			private int num=0;
			@Override
			public void run() {
				super.run();
				num++;
				System.out.println("二號視窗賣完了");
			}
		};
		Thread t3 = new Thread(mt, "三號視窗"){
			private int num=0;
			@Override
			public void run() {
				super.run();
				num++;
				System.out.println("三號視窗賣完了");
			}
		};

結果則是:

 

一號視窗賣票---->9
三號視窗賣票---->8
二號視窗賣票---->10
三號視窗賣票---->6
一號視窗賣票---->7
三號視窗賣票---->4
二號視窗賣票---->5
三號視窗賣票---->2
一號視窗賣票---->3
三號視窗賣完了
二號視窗賣票---->1
一號視窗賣完了
二號視窗賣完了

看到這裡,我想你應該明白了什麼

這裡可以用於書寫thread物件裡runbable物件的run()方法執行完畢後的操作或者監聽



 

 

 

相關文章