摘要:線程狀態內部枚舉類還未可運行狀態運行狀態。無限期等待狀態。注意,這只是一個,可能無實質影響。線程中斷中斷線程判斷是否被中斷判斷是否被中斷,并清除當前中斷狀態的中斷是一種協作機制。僅僅只是將線程的中斷狀態置為,該中斷狀態由方法設置。
Daemon Thread
Java中有兩類線程:User Thread(用戶線程)、Daemon Thread(守護線程,后臺一些系統性的服務,比如垃圾回收線程、JIT線程)?。
如果 User Thread已經全部退出運行了,只剩下Daemon Thread存在了,那么虛擬機也就退出了(不管Daemon Thread是否結束)。
設置守護線程:
Thread?daemonTread?=?new?Thread();?? daemonThread.setDaemon(true);??//必須在thread.start()之前設置,否則會跑出一個IllegalThreadStateException異常。 daemonThread.isDaemon();??//檢驗守護線程。
在Daemon線程中產生的新線程也是Daemon的。?
線程狀態Thread內部枚舉類:
public enum State { NEW, //還未start() RUNNABLE, //(可運行狀態、運行狀態。到底是哪個狀態由CPU時間片輪轉來決定,輪到了就是運行狀態,沒輪到就是可運行狀態。) BLOCKED, //阻塞狀態。申請某些鎖或某個對象的監視器,線程會被阻塞住。 WAITING, //無限期等待狀態。調用了wait方法。進入Waiting狀態的線程會等待其他線程給它notify,通知到之后由Waiting狀態又切換到Runnable狀態繼續執行。 TIMED_WAITING, //有限期等待狀態。等待xx秒還是沒有被notify,則自動切換到Runnable狀態。 TERMINATED; //結束狀態。 }
注:在實例化線程并start()之后,線程是進入可運行狀態。
API線程優先級:
并不一定是高優先級一定先完成。只是高優先級完成的概率比較大,但是低優先級還是有可能先完成的。
Thread.yield()
Thread.yield()只是對CPU的一個暗示,暗示當前線程可讓出運行位置(從運行狀態轉到可運行狀態),讓其他線程占用CPU核心。注意,這只是一個hint,可能無實質影響。也就是說不能保證當前運行的線程立即轉化到可運行狀態。
Thread.join()
Thread t = new Thread(() -> { //do something }); t.start(); t.join(1000); //等待線程t結束或1000毫秒
join本質是Object.wait(long timeout),即當前線程(主線程)進入waiting狀態,監控對象為t。當一個線程運行完成終止后,將會調用notifyAll方法去喚醒等待在該線程實例上的所有線程,該操作由JVM完成。
Object.wait(long timeout)
將當前線程進入waiting狀態(釋放了鎖),直到調用Object.notify()或Object.notifyAll() 或時間超過timeout。
synchronized (MonitorObject) { // do something MonitorObject.wait(); // do something MonitorObject.notifyAll(); }
wait、notify、notifyAll方法必須在同步塊中(正在監視對象)。
sleep和wait主要區別:
sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法。
Object.notify()
Wakes up a single thread that is waiting on this object"s monitor. If any threads are waiting on this object, one of them is chosen to be awakened.
notifyAll()就是喚醒所有線程。
public void Thread.interrupt() // 中斷線程 public boolean Thread.isInterrupted() // 判斷是否被中斷 public static boolean Thread.interrupted() // 判斷是否被中斷,并清除當前中斷狀態
Java的中斷是一種協作機制。也就是說Thread.interrupt()并不一定就中斷了正在運行的線程,它只是要求線程自己在合適的時機中斷自己。
interrupt()僅僅只是將線程的中斷狀態置為true,該中斷狀態由native方法interrupt0()設置。
interrupt()只針對3種情況:
If this thread is blocked in an invocation of the wait(), wait(long), or wait(long, int) methods of the Object class, or of the join(), join(long), join(long, int), sleep(long), or sleep(long, int), methods of this class, then its interrupt status will be cleared and it will receive an InterruptedException.
If this thread is blocked in an I/O operation upon a java.nio.channels.InterruptibleChannel then the channel will be closed, the thread"s interrupt status will be set, and the thread will receive a java.nio.channels.ClosedByInterruptException.
If this thread is blocked in a java.nio.channels.Selector then the thread"s interrupt status will be set and it will return immediately from the selection operation, possibly with a non-zero value, just as if the selector"s wakeup method were invoked.
對于其他情況,只會將線程中斷狀態置為true。
對于非阻塞線程,只是改變了中斷狀態,并不會使線程停止:
Thread nonBlocking = new Thread(() -> { while (true) { System.out.println("Produce -> ");// do something } }); nonBlocking.start(); nonBlocking.interrupt();// this thread"s interrupt status will be set nonBlocking.join();
你應該這樣做:
Thread nonBlocking = new Thread(() -> { while (true) { if (Thread.currentThread().isInterrupted()) { System.out.println("Interrupted!"); break; } System.out.println("Produce -> "); /* do something */ } });
//
nonBlocking.start(); Thread.sleep(10); //確保第一次循環跑過if判斷 nonBlocking.interrupt(); nonBlocking.join();
對于阻塞線程:
Thread blocking = new Thread(() -> { while (true) { if (Thread.currentThread().isInterrupted()) { System.out.println("Interrupted!"); break; } try { Thread.sleep(60_000); } catch (InterruptedException e) { System.out.println("InterruptedException When blocking"); /*因為拋出異常后會清除中斷狀態,所以設置中斷狀態,從而使得下一個while循環if判斷為true,跳出循環。*/ Thread.currentThread().interrupt(); } } });
//
blocking.start(); Thread.sleep(10); //確保第一次循環跑過if判斷 blocking.interrupt(); blocking.join();
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/67268.html
摘要:下面我們通過代碼來看一下實現和區別三種實現繼承,重寫方法實現接口,實現方法實現接口,實現方法,帶有返回值和異常如何使用第一種實現方式第二種實現方式第三種實現從代碼可以看出以上提到的區別,,。第二種方式并沒有體現共用同一個。 Java實現線程的三種方式和區別 Java實現線程的三種方式: 繼承Thread 實現Runnable接口 實現Callable接口 區別: 第一種方式繼承T...
摘要:的應用方式代碼塊作用范圍在中,作用對象是調用這個代碼塊的對象。方法進來了出來了運行的結果如下等把方法執行完,釋放了的鎖,才開始執行。靜態方法運行的結果如下等待執行完才執行,說明是類鎖類所的另外一種形式運行結果如下 synchronized的應用方式 代碼塊:作用范圍在{}中,作用對象是調用這個代碼塊的對象。 方法:作用范圍是一個方法,作用對象是調用這個方法的對象。 靜態方法:作用范圍...
摘要:在程序開發中一定遇到并發編程的場景雖然我們大部分時間并不直接使用但是是多線程的基礎面試中也會總是被問到與線程有關的問題那么線程都有哪些知識呢最近在研究線程的源碼的時候也總結了關于線程一些基本知識線程是什么線程是輕量級的進程是操作系統調度任務 在程序開發中, 一定遇到并發編程的場景, 雖然我們大部分時間并不直接使用Thread, 但是Thread是多線程的基礎, 面試中也會總是被問到與線...
摘要:主線程名我們啟動的一個程序可以理解為一個進程一個進程中包含一個主線程線程可以理解為一個子任務中可以通過下面代碼來獲取默認的主線程名運行結果為這是線程的名字并不是方法通過此線程來執行方法而已兩種方式創建線程繼承類實現接口實現接口并且多線程運行 Java 主線程名 我們啟動的一個程序可以理解為一個進程, 一個進程中包含一個主線程, 線程可以理解為一個子任務. Java 中可以通過下面代碼來...
默認使用的線程池 不傳executor時默認使用ForkJoinPool.commonPool() IntStream.range(0, 15).parallel().forEach(i -> { System.out.println(Thread.currentThread()); }); 輸出 Thread[ForkJoinPool.commonPoo...
摘要:本人郵箱歡迎轉載轉載請注明網址代碼已經全部托管有需要的同學自行下載類學習線程的開發者首先遇到的第一個類就是通過使用類我們就可以啟動停止中斷一個線程在同一個時間片里可能會有多個線程在執行每個線程都擁有它自己的方法調用堆棧參數和變量每個至少會有 本人郵箱: 歡迎轉載,轉載請注明網址 http://blog.csdn.net/tianshi_kcogithub: https://github...
閱讀 3310·2023-04-25 19:42
閱讀 1329·2021-11-23 10:11
閱讀 2252·2021-11-16 11:51
閱讀 1590·2019-08-30 15:54
閱讀 2036·2019-08-29 18:44
閱讀 1609·2019-08-23 18:24
閱讀 494·2019-08-23 17:52
閱讀 1764·2019-08-23 15:33