【java】【多執行緒】建立執行緒的兩種常用方式(2)
java虛擬機器允許應用程式吧併發的執行多個執行緒。
Java有三種建立執行緒的方式,分別是繼承Thread類、實現Runable介面和使用執行緒池。前兩種最常用。最後一種後期補充學習。
1、繼承Thread類
(1)定義類整合Thread類,並重寫父類的run()方法,方法裡的內容就是執行緒所要執行的任務;(2)建立子類的例項,即生成執行緒的例項物件;
(3)呼叫現成的start()方法來啟動執行緒,內部會自動呼叫run方法。
注意:若不使用start()方法開啟執行緒,只呼叫run方法相當於單純的呼叫方法而已並沒有開啟執行緒,程式依然會使用main單執行緒執行。
start方法有兩種含義:
- 啟動多執行緒。
- 呼叫執行緒中的run方法(具體怎麼呼叫run方法是由虛擬機器執行的,無法通過原始碼檢視)
public class Demo2_Thread {
public static void main(String[] args) {
MyThread mt = new MyThread(); //4,建立自定義類的物件
mt.start(); //5,開啟執行緒
for(int i = 0; i < 3000; i++) {
System.out.println("bb");
}
}
}
class MyThread extends Thread { //1,定義類繼承Thread
public void run() { //2,重寫run方法
for(int i = 0; i < 3000; i++) { //3,將要執行的程式碼,寫在run方法中
System.out.println("aa");
}
}
}
2、實現Runnable介面
(1)定義類實現Runnable介面
(2)實現run方法,這個run()方法和Thread中的run()方法一樣是執行緒的執行體。把新執行緒要做的事寫在run方法中
注意:Runnable介面中只有run方法。
(3)建立自定義的Runnable的子類物件
(4)建立Thread物件, 傳入Runnable子類物件。因為runnable介面中沒有start方法,需借用Thread類的start方法。Thread物件才是真正的執行緒物件
(5)呼叫start()開啟新執行緒, 內部會自動呼叫Runnable的run()方法.
public class Demo3_Runnable {
public static void main(String[] args) {
MyRunnable mr = new MyRunnable(); //4,建立自定義類物件
//Runnable target = new MyRunnable();
Thread t = new Thread(mr); //5,將其當作引數傳遞給Thread的建構函式
t.start(); //6,開啟執行緒
for(int i = 0; i < 3000; i++) {
System.out.println("bb");
}
}
}
class MyRunnable implements Runnable { //1,自定義類實現Runnable介面
@Override
public void run() { //2,重寫run方法
for(int i = 0; i < 3000; i++) { //3,將要執行的程式碼,寫在run方法中
System.out.println("aaaaaaaaaaaaaaaaaaaaaaaaaaaa");
}
}
}
實現Runnable的原理 (瞭解)
* 檢視原始碼
* 1,看Thread類的建構函式,傳遞 了Runnable介面的引用
* 2,通過init()方法找到傳遞的target給成員變數的target賦值
* 3,檢視run方法,發現run方法中有判斷,如果target不為null就會呼叫Runnable介面子類物件的run方法
3、繼承方式與實現方式有什麼區別
1、檢視原始碼的區別:
- 繼承Thread:由於子類重寫了Thread類的run(), 當呼叫start()時, 直接找子類的run()方法
- 實現Runnable:建構函式中傳入了Runnable的引用, 成員變數記住了它(this), start()呼叫run()方法時內部判斷成員變數Runnable的引用是否為空, 不為空編譯時看的是Runnable的run(),執行時執行的是子類的run()方法
2、多執行緒執行程式碼位置不同:
繼承Thread類:程式碼存放在Thread類的run方法中
實現Runnable類:程式碼存放在Runnable介面的run方法中。
4、繼承方式與實現方式的優缺點
1、 繼承Thread
* 好處:可以直接使用Thread類中的方法,程式碼簡單
* 弊端:如果已經有了父類,就不能用這種方法
2、 實現Runnable介面
* 好處:即使自己定義的執行緒類有了父類也沒關係,因為有了父類也可以實現介面,而且介面是可以多實現的,避免了單繼承的侷限性
* 弊端:不能直接使用Thread中的方法需要先獲取到執行緒物件後,才能得到Thread的方法,程式碼複雜
注意:繼承方式和實現方式的優缺點是互換的。
5、使用匿名內部類實現執行緒的兩種方式
1)繼承Thread類
new Thread() { //1,new 類(){}繼承這個類
public void run() { //2,重寫run方法
for(int i = 0; i < 3000; i++) { //3,將要執行的程式碼,寫在run方法中
System.out.println("aa");
}
}
}.start();
2)實現Runnable介面
new Thread(new Runnable(){ //1,new 介面(){}實現這個介面
public void run() { //2,重寫run方法
for(int i = 0; i < 3000; i++) { //3,將要執行的程式碼,寫在run方法中
System.out.println("bb");
}
}
}).start();
相關文章
- Java建立多執行緒的四種方式Java執行緒
- Java建立多執行緒的幾種方式實現Java執行緒
- 多執行緒的建立 兩種方式以及使用建議執行緒
- Java多執行緒(2)執行緒鎖Java執行緒
- 執行緒、開啟執行緒的兩種方式、執行緒下的Join方法、守護執行緒執行緒
- java--執行緒池--建立執行緒池的幾種方式與執行緒池操作詳解Java執行緒
- 建立執行緒的三種方式執行緒
- 執行緒建立的四種方式執行緒
- Java建立多執行緒的一種方法Java執行緒
- Java中確保執行緒安全最常用的兩種方式Java執行緒
- 多執行緒------執行緒與程式/執行緒排程/建立執行緒執行緒
- java的執行緒、建立執行緒的 3 種方式、靜態代理模式、Lambda表示式簡化執行緒Java執行緒模式
- 【Java】執行緒的建立方式Java執行緒
- Java多執行緒學習(2)執行緒控制Java執行緒
- Java多執行緒學習(1)建立執行緒與執行緒的生命週期Java執行緒
- Java併發(三)----建立執行緒的三種方式及檢視程式執行緒Java執行緒
- java 多執行緒-2Java執行緒
- 關於多執行緒的兩種實現方式執行緒
- 執行緒池建立的幾種方式執行緒
- Java實現多執行緒的三種方式Java執行緒
- Java多執行緒-執行緒中止Java執行緒
- Java併發基礎01:揭祕傳統執行緒技術中建立執行緒的兩種方式Java執行緒
- 【併發技術01】傳統執行緒技術中建立執行緒的兩種方式執行緒
- Java之自定義執行緒的2種方式Java執行緒
- 執行緒池的五種狀態及建立執行緒池的幾種方式執行緒
- Java基礎:執行緒的三種建立方式Java執行緒
- Java 中執行緒池的7種建立方式!Java執行緒
- Java 執行緒建立與常用方法Java執行緒
- 【Java多執行緒】執行緒安全的集合Java執行緒
- Java多執行緒-執行緒池的使用Java執行緒
- Java多執行緒之執行緒中止Java執行緒
- Java多執行緒-執行緒狀態Java執行緒
- Java多執行緒-執行緒通訊Java執行緒
- java 多執行緒守護執行緒Java執行緒
- java多執行緒9:執行緒池Java執行緒
- 【java多執行緒】(二)執行緒停止Java執行緒
- 【 Thread】建立執行緒的2種方法thread執行緒
- Java多執行緒實現方式Java執行緒