package com.qianfeng.demo01;
/**
* 停止线程:
* 第三种方式:
* 如果读不到标记怎么办?
* 比如说在任务中让线程处于阻塞状态,无法执行标记,释放执行资格。
* run方法没有结束,所以线程无法停止,所以线程也没有办法退出。
*
* Thread当中有一个interrupt的方法,可以使线程从阻塞状态清除,恢复到就绪状态,让线程具备执行资格。
* interrupt():中断线程。
*
* InterruptedException:线程中断异常,线程在不该醒的时候醒了,就会报这个异常。
*
* setDaemon(boolean on) 将该线程标记为守护线程或用户线程
* 守护线程:相当于后台线程,当程序中其他线程都已经停止时,守护线程自动停止,如果有三个线程a,b,c,把a设置为守护线程,
* 他们启动时是一样的,抢夺资源时是一样的,但是结束是不一样的,当前台线程b,c结束时,a自动结束,也就是说前台线程才是
* 主要线程,守护线程的特点:具备了一定的依赖性。
*
*
* */
class StopRun2 implements Runnable{
private boolean flag = true;
public void setFlag(boolean flag) {
this.flag = flag;
}
@Override
public synchronized void run() {
while (flag) {
try {
this.wait();
} catch (InterruptedException e) {
// e.printStackTrace();
System.out.println(Thread.currentThread().getName()+"被打断了");
}
System.out.println(Thread.currentThread().getName()+".....run");
}
}
}
public class StopThreadDemo02 {
public static void main(String[] args) {
StopRun2 sRun = new StopRun2();
Thread t1 = new Thread(sRun);
Thread t2 = new Thread(sRun);
t1.start();
t2.setDaemon(true); //把t2标记为守护线程
t2.start();
int num = 0;
while (true) {
if (++num==50) {
sRun.setFlag(false);
//清除t1和t2的冻结状态去
t1.interrupt();
// t2.interrupt();
break;
}
System.out.println(Thread.currentThread().getName()+".....run.."+num);
}
System.out.println("over");
}
}
多线程——停止线程(intertupt方法setDaemon和方法的使用)
最新推荐文章于 2021-10-20 09:44:11 发布