本文目錄一覽:
- 1、JAVA中如何控制線程的啟動與暫停
- 2、在java中啟動線程使用run()還是start()?
- 3、java啟動一個線程是用run()還是start()?run()和start()的區別?
- 4、java啟用另外一個線程設置無超時狀態
JAVA中如何控制線程的啟動與暫停
pre t=”code” l=”java”boolean run = true;
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
while(run){
// 所需執行的代碼
}
}
});
按鈕打開時,可以run = true; thread.start();開啟線程
按鈕關閉時, run = false; 線程自動關閉。
在java中啟動線程使用run()還是start()?
啟動一個線程用start()方法,使線程所代表的虛擬處理機處於可運行的狀態,這意味着它可以有JVM(java虛擬機)來調度和執行,這並不意味着線程就會立即執行。run()方法可以產生必須退出的標誌來停止一個線程。
java啟動一個線程是用run()還是start()?run()和start()的區別?
啟動線程肯定要用start()方法。當用start()開始一個線程後,線程就進入就緒狀態,使線程所代表的虛擬處理機處於可運行狀態,這意味着它可以由JVM調度並執行。這並不意味着線程就會立即運行。當cpu分配給它時間時,才開始執行run()方法(如果有的話)。START()是方法,它調用RUN()方法.而RUN()方法是你必須重寫的. run()方法中包含的是線程的主體
java啟用另外一個線程設置無超時狀態
Java的線程是不允許啟動兩次的,第二次調用必然會拋出IllegalThreadStateException,這是一種運行時異常,多次調用start被認為是編程錯誤。
關於線程生命周期的不同狀態,在Java 5以後,線程狀態被明確定義在其公共內部枚舉類型java.lang.Thread.State中,分別是:
新建(NEW),表示線程被創建出來還沒真正啟動的狀態,可以認為它是個Java內部狀態。
就緒(RUNNABLE),表示該線程已經在JVM中執行,當然由於執行需要計算資源,它可能是正在運行,也可能還在等待系統分配給它CPU片段,在就緒隊列裡面排隊。 在其他一些分析中,會額外區分一種狀態RUNNING,但是從Java API的角度,並不能表示出來。
阻塞(BLOCKED),這個狀態和我們前面兩講介紹的同步非常相關,阻塞表示線程在等待Monitor lock。比如,線程試圖通過synchronized去獲取某個鎖,但是其他線程已經獨佔了,那麼當前線程就會處於阻塞狀態。
等待(WAITING),表示正在等待其他線程採取某些操作。一個常見的場景是類似生產者消費者模式,發現任務條件尚未滿足,就讓當前消費者線程等待(wait),另外的生產者線程去準備任務數據,然後通過類似notify等動作,通知消費線程可以繼續工作了。Thread.join()也會令線程進入等待狀態。
計時等待(TIMED_WAIT),其進入條件和等待狀態類似,但是調用的是存在超時條件的方法,比如wait或join等方法的指定超時版本,如下面示例:
public final native void wait(long timeout) throws InterruptedException;
終止(TERMINATED),不管是意外退出還是正常執行結束,線程已經完成使命,終止運行,也有人把這個狀態叫作死亡。
在第二次調用start()方法的時候,線程可能處於終止或者其他(非NEW)狀態,但是不論如何,都是不可以再次啟動的。
考點分析
今天的問題可以算是個常見的面試熱身題目,前面的給出的典型回答,算是對基本狀態和簡單流轉的一個介紹,如果覺得還不夠直觀,我在下面分析會對比一個狀態圖進行介紹。總的來說,理解線程對於我們日常開發或者診斷分析,都是不可或缺的基礎。
面試官可能會以此為契機,從各種不同角度考察你對線程的掌握:
相對理論一些的面試官可以會問你線程到底是什麼以及Java底層實現方式。
線程狀態的切換,以及和鎖等並發工具類的互動。
線程編程時容易踩的坑與建議等。
可以看出,僅僅是一個線程,就有非常多的內容需要掌握。我們選擇重點內容,開始進入詳細分析。
知識擴展
首先,我們來整體看一下線程是什麼?
從操作系統的角度,可以簡單認為,線程是系統調度的最小單元,一個進程可以包含多個線程,作為任務的真正運作者,有自己的棧(Stack)、寄存器(Register)、本地存儲(Thread Local)等,但是會和進程內其他線程共享文件描述符、虛擬地址空間等。
在具體實現中,線程還分為內核線程、用戶線程,Java的線程實現其實是與虛擬機相關的。對於我們最熟悉的Sun/Oracle JDK,其線程也經歷了一個演進過程,基本上在Java 1.2之後,JDK已經拋棄了所謂的Green Thread,也就是用戶調度的線程,現在的模型是一對一映射到操作系統內核線程。
如果我們來看Thread的源碼,你會發現其基本操作邏輯大都是以JNI形式調用的本地代碼。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/188276.html