Thread是如何處理Runnable的
靈感來源於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()方法執行完畢後的操作或者監聽
相關文章
- Thread和Runnable的區別thread
- 併發-2-Thread和Runnable的APIthreadAPI
- Java中Thread 和Runnable 深入理解Javathread
- 【胡思亂想】命令模式 與 Thread Runnable模式thread
- 聊聊MySQL是如何處理排序的MySql排序
- Spring是如何處理註解的Spring
- 重複提交,你是如何處理的?
- nginx 是如何處理過期事件的?Nginx事件
- 使用Thread類和Runnable介面實現多執行緒的區別thread執行緒
- 阿里是如何處理分散式事務的阿里分散式
- Tomcat中的容器是如何處理請求的Tomcat
- DM 是如何處理 DML 的丨TiDB 工具分享TiDB
- c語言是如何處理函式呼叫的?C語言函式
- Netty是如何處理新連線接入事件的?Netty事件
- java多執行緒程式設計,Thread,Runnable,Future相關知識Java執行緒程式設計thread
- 淺析Node是如何進行錯誤處理的
- 面對“套路貸”借貸寶是如何處理的?
- 你是如何更好地處理Async/Await的異常的?AI
- 什麼是殭屍程式以及如何處理
- Laravel 底層是如何處理HTTP請求LaravelHTTP
- JSP 異常處理如何處理?JS
- 「Go框架」gin框架是如何做崩潰處理的?Go框架
- 你知道MySQL是如何處理千萬級資料的嗎?MySql
- Kafka是如何處理Netflix每天2萬億條訊息的?Kafka
- 如果新增欄位是外來鍵,如何處理?
- SDWebImage載入圖片的URL是同一個(如何處理)Web
- 蘋果A12是四核還是六核處理器?iPhone Xs的處理器是幾核的蘋果iPhone
- Python如何處理檔案的?Python
- 什麼是流處理
- 什麼是批處理
- 惡劣的網路環境下,Netty是如何處理寫事件的?Netty事件
- fetch 如何處理 302?
- 如何優雅的處理異常
- 供應鏈攻擊是什麼?應該如何處理?
- 使用Sql插入sde是ObjectId的處理方式SQLObject
- python異常處理的流程是什麼?Python
- Service 層異常拋到 Controller 層處理還是直接處理?Controller
- 什麼是跨域,後端工程師如何處理跨域跨域後端工程師
- Linux程式卡死,如何處理?Linux