1. 程式人生 > 實用技巧 >Thread執行緒控制之sleep、join、setDaemon方法的用處

Thread執行緒控制之sleep、join、setDaemon方法的用處

Thread執行緒控制之sleep、join、setDaemon方法的用處

1.sleep方法

public staticvoidsleep(longmillis)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 finalvoidjoin() 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 finalvoidsetDaemon(booleanon)

將此執行緒標記為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 finalbooleanisDaemon() 測試這個執行緒是否是守護執行緒。
結果  
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());

測試結果: