Thread線程控制之sleep、join、setDaemon方法的用處

Thread線程控制之sleep、join、setDaemon方法的用處java

 

1. sleep方法ide

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 }

測試結果:spa

 

 Thread.sleep(-2000); 該方法的參數值要有效(不能爲負數),不然會拋出異常。線程

 

2. join方法code

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 }

測試結果:blog

 

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線程執行完以後就只剩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 }

測試結果:

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());

測試結果:

相關文章
相關標籤/搜索