Thread執行緒控制之sleep、join、setDaemon方法的用處
1. sleep方法
public static void sleep(long millis) throws InterruptedException
使當前正在執行的執行緒以指定的毫秒數暫停(暫時停止執行),具體取決於系統定時器和排程程式的精度和準確性。 執行緒不會丟失任何顯示器的所有權。
- 引數
millis
- 以毫秒為單位的睡眠時間長度 - 異常
IllegalArgumentException
- 如果millis
值為負數 InterruptedException
- 如果任何執行緒中斷當前執行緒。 當丟擲此異常時,當前執行緒的中斷狀態將被清除。- 下面將使用sleep方法使執行緒暫停指定的秒數(兩秒)
-
1 package com.tianjh.thread; 2 3 4 /** 5 * Created on 2021/1/11 6 * 定義一個類MyThread繼承Thread類 7 * 在MyThread類中重寫run()方法 8 * 9 * @author tianjh 10 */ 11 public class MyThread extends Thread { 12 13 public MyThread() { 14 } 15 16 public MyThread(String name) { 17 /* 18 * 呼叫父類的帶參構造方法 19 * public Thread(String name) { 20 * init(null, null, name, 0); 21 * } 22 */ 23 super(name); 24 } 25 26 @Override 27 public void run() { 28 for (int i = 0; i < 10; i++) { 29 // Thread類的getName()方法: 返回此執行緒的名稱 30 System.out.println(getName() + ":" + i); 31 try { 32 // 使執行緒停留兩秒之後在執行 33 Thread.sleep(2000); 34 } catch (InterruptedException e) { 35 e.printStackTrace(); 36 } 37 } 38 } 39 40 public static void main(String[] args) { 41 // 1.建立MyThread類的物件 42 MyThread myThread1 = new MyThread("執行緒1"); 43 MyThread myThread2 = new MyThread("執行緒2"); 44 MyThread myThread3 = new MyThread("執行緒3"); 45 46 // 2.啟動執行緒 47 myThread1.start(); 48 myThread2.start(); 49 myThread3.start(); 50 51 } 52 }
測試結果:
Thread.sleep(-2000); 該方法的引數值要有效(不能為負數),否則會丟擲異常。
2. join方法
public final void join() throws InterruptedException
等待這個執行緒死亡。
- 異常
InterruptedException
- 如果任何執行緒中斷當前執行緒。 當丟擲此異常時,當前執行緒的中斷狀態將被清除。 - 下例是當myThread1死亡之後才執行其它執行緒,還未死亡之前是不能執行其它任何執行緒的。
1 package com.tianjh.thread; 2 3 4 /** 5 * Created on 2021/1/11 6 * 定義一個類MyThread繼承Thread類 7 * 在MyThread類中重寫run()方法 8 * 9 */ 10 public class MyThread extends Thread { 11 12 public MyThread() { 13 } 14 15 public MyThread(String name) { 16 super(name); 17 } 18 19 @Override 20 public void run() { 21 for (int i = 0; i < 10; i++) { 22 System.out.println(getName() + ":" + i); 23 } 24 } 25 26 public static void main(String[] args) { 27 // 1.建立MyThread類的物件 28 MyThread myThread1 = new MyThread("執行緒1"); 29 MyThread myThread2 = new MyThread("執行緒2"); 30 MyThread myThread3 = new MyThread("執行緒3"); 31 32 // 2.啟動執行緒 33 myThread1.start(); 34 try { 35 // 等待myThread1執行緒死亡,只有當該執行緒死亡之後才能繼續執行其它執行緒 36 myThread1.join(); 37 } catch (InterruptedException e) { 38 e.printStackTrace(); 39 } 40 myThread2.start(); 41 myThread3.start(); 42 43 } 44 }
測試結果:
3. setDaemon
public final void setDaemon(boolean on)
將此執行緒標記為daemon執行緒或使用者執行緒。 當執行的唯一執行緒都是守護程式執行緒時,Java虛擬機器將退出。
執行緒啟動前必須呼叫此方法。
- 引數
on
- 如果true
,將此執行緒標記為守護執行緒 - 異常
IllegalThreadStateException
- 如果這個執行緒是 aliveSecurityException
- 如果checkAccess()
確定當前執行緒不能修改此執行緒-
1 package com.tianjh.thread; 2 3 4 /** 5 * Created on 2021/1/11 6 * 定義一個類MyThread繼承Thread類 7 * 在MyThread類中重寫run()方法 8 * 9 */ 10 public class MyThread extends Thread { 11 12 public MyThread() { 13 } 14 15 public MyThread(String name) { 16 super(name); 17 } 18 19 @Override 20 public void run() { 21 for (int i = 0; i < 100; i++) { 22 System.out.println(getName() + ":" + i); 23 } 24 } 25 26 public static void main(String[] args) { 27 // 1.建立MyThread類的物件 28 MyThread myThread1 = new MyThread("執行緒1"); 29 MyThread myThread2 = new MyThread("執行緒2"); 30 31 // 設定當前main為主執行緒 32 Thread.currentThread().setName("主執行緒"); 33 34 /* 35 * 設定為守護執行緒 36 * 當執行的剩餘執行緒都是守護程式執行緒時,Java虛擬機器將退出。 37 * 也就是當main執行緒執行完之後就只剩myThread1、myThread2執行緒了,它們都是守護執行緒, 38 * 所以此時JVM會退出,也就不再繼續執行其它執行緒了 39 * 執行緒啟動前必須呼叫setDaemon()方法 40 */ 41 myThread1.setDaemon(true); 42 myThread2.setDaemon(true); 43 44 // 2.啟動執行緒 45 myThread1.start(); 46 myThread2.start(); 47 48 // 讓主執行緒執行10次 49 for (int i = 0; i < 10; i++) { 50 System.out.println(Thread.currentThread().getName() + ":" + i); 51 } 52 53 } 54 }
測試結果:
- public final boolean isDaemon()
測試這個執行緒是否是守護執行緒。
- 結果
true:
如果這個執行緒是一個守護執行緒;false:不是守護執行緒
。
1 myThread1.setDaemon(true); 2 myThread2.setDaemon(true); 3 4 // 2.啟動執行緒 5 myThread1.start(); 6 myThread2.start(); 7 8 System.out.println("myThread1執行緒是否為守護執行緒? "+myThread1.isDaemon());
測試結果: