1.问题
当我们认为某个任务执行时间太长了,想要停止这个任务,在线程池里应该如何实现呢?
2.不用线程池如何停止一个线程
停止线程池里的任务等同于停止一个线程,所以我们需要先了解如何停止一个线程。
网上很多博客写了停止一个线程解决方法,停止一个线程有三种方法。
2.1使用标识
示例:
static volatile boolean flag = true; public static void main(String[] args) throws InterruptedException { Thread thread = new Thread(new Runnable() { @Override public void run() { try { while (flag) { Thread.sleep(1000); System.err.println("print a"); } } catch (InterruptedException e) { System.err.println("我是在sleep interrupted"); } } }, "t1"); thread.start(); Thread.sleep(5000); flag = false; }
注意使用volatile关键字
2.2使用stop
作废,不用关心了
2.3使用interrupt
示例:
public static void main(String[] args) throws Exception { Thread thread = new Thread(new Runnable() { @Override public void run() { try { while (true) { Thread.sleep(1000); //写了sleep就不用写下面的判断 if (Thread.currentThread().isInterrupted()) { throw new InterruptedException(); } System.err.println("print a"); } } catch (InterruptedException e) { e.printStackTrace(); } } }, "t1"); thread.start(); Thread.sleep(20); thread.interrupt(); }
3.停止线程池里的任务
按照停止线程方法,停止线程池里的任务有两种方法(stop作废)
3.1使用标识
这儿不贴代码了,思路比较简单,使用全局的Map存任务名与是否停止,在任务里判断。
3.2使用interrupt
示例:
public class ThreadPoolStopThread { static class MyRunnable implements Runnable { private String jobName; private Thread nowThread; MyRunnable(String jobName) { this.jobName = jobName; } public void setInterrupted() { nowThread.interrupt(); } @Override public void run() { nowThread = Thread.currentThread(); try { while (true) { Thread.sleep(1000); // 写了sleep就不用再判断isInterrupted()了 System.err.println("当前线程:" + Thread.currentThread().getName() + " 当前任务:" + jobName); } } catch (InterruptedException e) { System.err.println("当前线程:" + Thread.currentThread().getName() + " 当前任务:" + jobName + "马上停止"); e.printStackTrace(); } } } public static void main(String[] args) throws InterruptedException { ExecutorService es = Executors.newFixedThreadPool(2, new MyThreadFactory()); MyRunnable job1 = new MyRunnable("job-1"); MyRunnable job2 = new MyRunnable("job-2"); MyRunnable job3 = new MyRunnable("job-3"); es.execute(job1); es.execute(job2); es.execute(job3); System.err.println("5s后停止job-1"); Thread.sleep(5000); job1.setInterrupted(); } }