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);

可以看到打印结果,执行第一次是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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值