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