Java四种线程池的停止

1.ScheduledExecutorService scheduleThreadPool = Executors.newScheduledThreadPool(6);

创建一个定长线程池,支持定时及周期性任务执行。

这种线程池支持延时任务和周期性任务,那就涉及到某个点不需要了,要取消任务。

public class ThreadPool {

    private static TimerTask timerTask;
    private static Runnable runnable;
    private static Future future;

    public static void main(String[] args) {
      ScheduledExecutorService scheduleThreadPool = Executors.newScheduledThreadPool(6);
       

        timerTask = new TimerTask() {
            @Override
            public void run() {
                System.out.println("timerTask执行了。");
            }
        };
        runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("Runnable执行了。");
                if (timerTask != null) {
                    timerTask.cancel();
                    timerTask = null;
                    future.cancel(true);
                    System.out.println("timerTask取消了。");
                }
            }
        };
        System.out.println("开启线程任务!1");
        future = scheduleThreadPool.scheduleAtFixedRate(timerTask, 5000, 2000, TimeUnit.MILLISECONDS);

        System.out.println("开启线程任务!2");
        scheduleThreadPool.schedule(runnable, 10000, TimeUnit.MILLISECONDS);
    }

}

上面是首次延时5s开始执行任务,且每隔2s执行一次。但在运行10s后,取消任务。主要使用的是 future.cancel(true);

Java四种线程池的停止_第1张图片

可以看到打印结果,执行第一次是5s,第二次是7s,第三次是9s,到第10s的时候执行了取消任务的操作。后面任务就不再执行了。

参数说明:future.cancel(false);  true:表示阻断当前线程,线程会被阻塞、无期限挂起。会中断执行此任务的线程。false:不会阻塞线程,但会停止此线程将要执行的任务。允许此线程中正在执行的任务继续执行直到完成。

2.其他线程池:

ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(6);
        ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();

cachedThreadPool.execute(timerTask);
        future = cachedThreadPool.submit(timerTask);

        fixedThreadPool.execute(timerTask);
        future = fixedThreadPool.submit(timerTask);

        singleThreadExecutor.execute(timerTask);
        future = scheduleThreadPool.submit(timerTask);

execute()方法都是没有返回值的。submit()返回值最终都是Future future;cancel(true)方法正好是future中的。可以用来取消任务。

两者的区别:https://blog.csdn.net/hayre/article/details/53314599

你可能感兴趣的:(java)