在前面的文章已经解释了中断的概念,它可以控制线程的中断状态,线程根据状态可以选择是否关闭线程 ,但是这样去关闭线程是不是有点粗鲁?有一种更优雅额方式实现线程的关闭,通过给线程加个开关,通过控制这个开关去实现线程的关闭。代码实现如下。
package juc.thread;
/**
* @Description 一个线程任务
* @Author DJZ-WWS
* @Date 2019/5/15 10:17
*/
public class Runner implements Runnable {
private long i;
private volatile boolean on=true;
@Override
public void run() {
while (on&&!Thread.currentThread().isInterrupted()){
i++;
}
System.out.println("Count i =" + i);
}
//优雅的关闭线程的方法
public void cancel(){
on=false;
}
}
测试方法
package juc.thread;
import java.util.concurrent.TimeUnit;
/**
* @Description
* @Author DJZ-WWS
* @Date 2019/5/15 10:37
*/
public class ShutDownThread {
public static void main(String[] args) throws InterruptedException {
Runner one=new Runner();
Thread countThread = new Thread(one, "countThread");
countThread.start();
//睡眠一秒,main线程对CountThread进行中断,是CountThread能够感知中断而结束。
TimeUnit.SECONDS.sleep(1);
countThread.interrupt();//设置线程的中断标记,运行的线程中断标记为false
//另一个线程
Runner two=new Runner();
countThread= new Thread(two, "CountThread");
countThread.start();
//睡眠一秒,main线程对Runner two进行取消
TimeUnit.SECONDS.sleep(1);
//真正的关闭线程
two.cancel();
}
}
上面的方法里面创建了两个线程,第一个线程通过线程调用interrupt方法()实现改变状态,第二个线程通过开关去实现关闭线程,显然第二种方式更好一些。这个开关的核心在while循环的条件里面,自习看一下条件应该是可以理解的,通过控制条件的不同,看做开关的关闭。