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
- Thread 和runnable的區別thread
- Java中Runnable和Thread的區別Javathread
- Java 中Thread 和Runnable的區別Javathread
- 併發-2-Thread和Runnable的APIthreadAPI
- Thread(Runnable xxx)中的問題thread
- Thread的wait和notify是指的是 Runnable物件而不是 Thread物件,切記,否則喚醒失效threadAI物件
- Java中Thread 和Runnable 深入理解Javathread
- java執行緒系列---Runnable和Thread的區別Java執行緒thread
- 【胡思亂想】命令模式 與 Thread Runnable模式thread
- Android中Handler Runnable與Thread的區別詳解Androidthread
- JAVA多執行緒Thread VS Runnable詳解Java執行緒thread
- 重複提交,你是如何處理的?
- Spring是如何處理註解的Spring
- nginx 是如何處理過期事件的?Nginx事件
- os thread startup等待事件HANG處理thread事件
- 阿里是如何處理分散式事務的阿里分散式
- Redis 是如何處理命令的(客戶端)Redis客戶端
- Thread 1 cannot allocate new log 的處理辦法thread
- c語言是如何處理函式呼叫的?C語言函式
- Tomcat中的容器是如何處理請求的Tomcat
- 使用Thread類和Runnable介面實現多執行緒的區別thread執行緒
- 淺析Node是如何進行錯誤處理的
- Netty是如何處理新連線接入事件的?Netty事件
- 面對“套路貸”借貸寶是如何處理的?
- DM 是如何處理 DML 的丨TiDB 工具分享TiDB
- 如何處理例外的?
- Laravel 底層是如何處理HTTP請求LaravelHTTP
- 什麼是殭屍程式以及如何處理
- python併發4:使用thread處理併發Pythonthread
- 你知道MySQL是如何處理千萬級資料的嗎?MySql
- 「Go框架」gin框架是如何做崩潰處理的?Go框架
- ofbiz對workflow的事務處理是如何做到的
- 如果新增欄位是外來鍵,如何處理?
- java多執行緒程式設計,Thread,Runnable,Future相關知識Java執行緒程式設計thread
- Python模組學習:thread 多執行緒處理Pythonthread執行緒
- JSP 異常處理如何處理?JS
- 蘋果A12是四核還是六核處理器?iPhone Xs的處理器是幾核的蘋果iPhone