多线程-守护线程-setDaemon

 1 package multithread4;
 2 /*
 3  * 停止线程:
 4  * 1,stop方法。
 5  * 
 6  * 2,run方法结束。
 7  * 
 8  * 怎么控制线程的任务结束呢?
 9  * 任务中都会有循环结构,只要控制住循环就可以结束任务,线程就结束
10  * 
11  * 控制循环通常就用定义标记来完成。
12  * 
13  * 但是如果线程处于冻结状态,无法读取标记。如何结束呢?
14  * 
15  * 可以使用interrupt()方法将线程从冻结状态强制恢复到运行状态中来,让线程具备cpu执行资格
16  * 但是强制动作会发生InterruptedException,记得要处理
17  */
18 
19 
20 
21 class StopThread implements Runnable{
22     private boolean flag = true;
23     public synchronized void run() {
24         while(flag) {
25             try {
26                 wait();//t0 t1进来都等待了读取不了标记,结束不了任务
27             } catch (InterruptedException e) {
28                 System.out.println(Thread.currentThread().getName()+"......."+e);
29                 flag = false;
30             }
31             System.out.println(Thread.currentThread().getName()+".....");
32         }
33     }
34     public void setFlag() {
35         flag = false;
36     }
37 }
38 public class DaemonThreadDemo {
39 
40     public static void main(String[] args) {
41         // TODO Auto-generated method stub
42         StopThread st = new StopThread();
43         
44         Thread t1 = new Thread(st);
45         Thread t2 = new Thread(st);
46         
47         t1.start();
48         t2.setDaemon(true);//开启线程2前守护线程, 可以理解为后台线程
49                            //如果所有前台线程都结束,后台线程无论处于什么状态都自动结束。
50                            //即当正在运行的线程都是守护线程(系统级线程或者用户线程)时,java虚拟机自动退出
51         t2.start();
52         
53         int num = 1;
54         for (; ; ) {
55             if (++num == 50) {
56 //                st.setFlag();
57                 t1.interrupt();
58 //                t2.interrupt();
59                 break;
60             }
61             System.out.println("main...."+num);
62         }
63         System.out.println("over");
64     }
65 
66 }
DaemonThreadDemo

 

posted @ 2021-11-11 17:29  doremi429  阅读(17)  评论(0)    收藏  举报