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
- 如果這個線程是 alive -
SecurityException
- 如果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());
測試結果: