1:方法介绍
suspend():暂停任务
resume():恢复任务
stop():停止任务
不推荐在使用这三个方法已suspend方法为例,在调用后,线程不会释放已经占有的资源比如锁,而是带着资源进入睡眠状态,十分容易引发死锁。同样stop方法在终结一个线程时,不能保证线程资源的正常释放,通常灭有基于线程完成资源释放的机会。
2:如何优雅的终止或者暂停线程尼?
package concurrencyTest4_2_5;
import java.util.concurrent.TimeUnit;
/**
* @author :dazhu
* @date :Created in 2020/4/8 17:22
* @description:避免使用suspend,resume和stop,如何优雅的暂停和恢复线程尼?
* @modified By:
* @version: $
*/
public class ShutDown {
public static void main(String[]args) throws Exception{
Runner one = new Runner();
Thread countThread = new Thread(one,"CountThread");
countThread.start();
//main线程睡眠1s
TimeUnit.SECONDS.sleep(1);
//通过interrupt方法来停止该线程
countThread.interrupt();
Runner two = new Runner();
countThread = new Thread(two,"CountThread");
countThread.start();
//main线程睡眠1秒,main线程对Runner two 进行取消,使得CountThread能够感知到on为false而结束
TimeUnit.SECONDS.sleep(1);
//通过调用cancel方法来停止该线程
two.cancel();
}
private static class Runner implements Runnable{
private long i;
private volatile boolean on = true;
@Override
public void run(){
System.out.println("进入run方法");
while(on&&!Thread.currentThread().isInterrupted()){
i++;
}
System.out.println("Count i = " +i);
System.out.println("run方法结束");
System.out.println("*************");
}
public void cancel(){
on = false;
}
}
}
使用中断方法或者cancel标志位方法都有机会让线程取释放自己占有的资源,这种方法更安全和优雅。