Thread線程控制之sleep、join、setDaemon方法的用處java
1. sleep方法ide
public static void sleep(long millis) throws InterruptedException測試
millis
- 以毫秒爲單位的睡眠時間長度
IllegalArgumentException
- 若是
millis
值爲負數
InterruptedException
- 若是任何線程中斷當前線程。 當拋出此異常時,當前線程的中斷狀態將被清除。
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 }
測試結果:spa
Thread.sleep(-2000); 該方法的參數值要有效(不能爲負數),不然會拋出異常。線程
2. join方法code
public final void join() throws InterruptedException對象
InterruptedException
- 若是任何線程中斷當前線程。 當拋出此異常時,當前線程的中斷狀態將被清除。
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 }
測試結果:blog
3. setDaemon繼承
public final void setDaemon(boolean on)進程
線程啓動前必須調用此方法。
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線程執行完以後就只剩myThread一、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 }
測試結果:
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());
測試結果: