JAVA多線程進(jìn)階方式(Runnable接口的講解和運(yùn)用)
JAVA多線程
到目前為止,線程都是通過擴(kuò)展Thread類來創(chuàng)建的,如果程序員需要繼承其他類(非Thread類),而且還要使用當(dāng)前類實(shí)現(xiàn)多線程,那么可以通過Runnable接口來進(jìn)行實(shí)現(xiàn)。
感謝借鑒,給予了我很大的學(xué)習(xí)。這里寫鏈接內(nèi)容
具體語法是:
public class Thread extends Object implements Runnable
使用Runnable 接口
啟動新的線程的步驟如下:
- 1.建立Runnable 對象
- 2.使用參數(shù)為Runnable 對象的構(gòu)造方法進(jìn)行創(chuàng)建Thread 實(shí)例
- 3.調(diào)用start()方法啟動線程
Runnable
接口應(yīng)該是有哪些打算通過某一個線程執(zhí)行其中實(shí)例的類進(jìn)行實(shí)現(xiàn),類必須定義一個稱為run的無參方法。
Thread (Runnable target)
創(chuàng)建線程第二種方式
實(shí)現(xiàn)Runnable 接口
1.定義類實(shí)現(xiàn)Runnable 接口
2. 覆蓋Runnable 接口中的run方法(將線程要運(yùn)行的代碼存放在該run方法中)
3. 通過Thread 類建立線程對象
4.將Runnale接口的子類對象作為實(shí)際的參數(shù)傳遞給Thread 類的構(gòu)造函數(shù)(為什么要Runnable 接口的自欸對象傳遞給Thread的子類對象,所以要讓線程去指定對象的run方法,就必須明確該run方法所屬的對象)
5.調(diào)用Thread 類的start方法開啟線程并且調(diào)用Runnable 接口的子類的run 方法。
- 此應(yīng)用程序公共類有一個double型類屬性(變量)x,初始值為0;
- 在應(yīng)用程序主進(jìn)程中新開兩個線程,這兩個線程都進(jìn)行死循環(huán);
- 第1個線程每隔300ms激活一次,令類屬性x自加1.0并輸出顯示;
- 第2個線程每隔400ms激活一次,令類屬性x自加0.1并輸出顯示。
public class tiaozhan4 { static double x=0; //定義一個浮點(diǎn)型變量并賦值 public static void main(String[] args){ Thread a=new Thread(new ACThread());//創(chuàng)建一個新的線程 Thread b=new Thread(new BCThread());//創(chuàng)建一個新的線程 System.out.println("初值:"+x);//顯示x初值是0 a.start(); b.start(); } public static class ACThread implements Runnable{ public void run(){ try{ while(true){ Thread.sleep(300); x+=1; System.out.println("線程1="+x); } } catch(InterruptedException e){ } } } public static class BCThread implements Runnable{ public void run(){ try{ while(true){ Thread.sleep(400); x+=0.1; System.out.println("線程2="+x); } } catch(InterruptedException e){ } } } }
結(jié)果
講解
public class tiaozhan4 { static double x=0; //定義一個浮點(diǎn)型變量并賦值 public static void main(String[] args){ Thread a=new Thread(new ACThread());//創(chuàng)建一個新的線程 Thread b=new Thread(new BCThread());//創(chuàng)建一個新的線程 System.out.println("初值:"+x);//初值為0 a.start(); b.start(); }
這里我們可以看到,}只有一個 說明,下面的我們寫的Runnable 接口類是包含在public class 里里面的,故在下面的函數(shù)名書寫中,我嘗試了寫出class 文件名的方式,但是系統(tǒng)發(fā)送報錯,我改為public static void 文件名是才可以運(yùn)行。
這一點(diǎn)我們需要注意,這是和Thread 類的不一樣的一點(diǎn)。
由于我們要在主函數(shù)的基礎(chǔ)上,新開兩個線程,所以我們在這里創(chuàng)建了兩個線程,并且start 開始運(yùn)行run 部分兩次。
public static class ACThread implements Runnable{ public void run(){ try{ while(true){ Thread.sleep(300); x+=1; System.out.println("線程1="+x); } } catch(InterruptedException e){ } } } public static class BCThread implements Runnable{ public void run(){ try{ while(true){ Thread.sleep(400); x+=0.1; System.out.println("線程2="+x); } } catch(InterruptedException e){ } } } }
這里就是按著文章的要求寫出該方法即可。
值得注意的是,用到啊了時間間隔Thread.sleep 時,需要進(jìn)行JAVA異常捕捉機(jī)制的書寫。
我們在輸出的時候去注明線程1和線程2,這樣子在輸出的時候可以便于觀察JAVA 虛擬機(jī)是如何將這兩個線程進(jìn)行分配運(yùn)行的。
注意
其實(shí),我們多運(yùn)行幾次就可以發(fā)現(xiàn),其實(shí)每次的結(jié)果可能會不太一樣。
因?yàn)樘摂M機(jī)的運(yùn)行,可能先開始執(zhí)行了線程1,當(dāng)線程1已經(jīng)10或者12的時候,這時候才開始執(zhí)行線程2,所以這就是剛開的時候全是整數(shù),后面逐漸多出來小數(shù)的原因。
總結(jié)
實(shí)現(xiàn)的方式和繼承的方法有什么區(qū)別?
實(shí)現(xiàn)的方式好處是避免了單繼承的局限性。
在定義線程的時候,建立使用實(shí)現(xiàn)的方式。
兩種方式的區(qū)別:繼承Thread :線程代碼存放Thread 子類 run方法中。
線程代碼存在接口的子類的run方法。
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解Spring Boot使用redis實(shí)現(xiàn)數(shù)據(jù)緩存
本篇文章主要介紹了詳解Spring Boot使用redis實(shí)現(xiàn)數(shù)據(jù)緩存,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04java接口返回參數(shù)按照請求參數(shù)進(jìn)行排序方式
這篇文章主要介紹了java接口返回參數(shù)按照請求參數(shù)進(jìn)行排序方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09Java實(shí)現(xiàn)郵件發(fā)送遇到的問題
本文給大家分享的是個人在項(xiàng)目過程中,使用Java實(shí)現(xiàn)郵件發(fā)送的時候所遇到的幾個問題以及解決方法,有需要的小伙伴可以參考下2016-09-09mac下idea啟動web項(xiàng)目報錯java.net.SocketException:socket closed
本文主要介紹了作者在項(xiàng)目啟動時遇到的一個問題——無法打開調(diào)試端口,經(jīng)過一系列排查和嘗試,最終發(fā)現(xiàn)是由于權(quán)限問題導(dǎo)致的,作者還分享了如何修改文件權(quán)限的方法,并提醒大家不要隨意kill掉占用端口的進(jìn)程2024-12-12Mybatis返回map集合時,列的順序與select不一致問題
這篇文章主要介紹了Mybatis返回map集合時,列的順序與select不一致問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01