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.youkuaiyun.com/hayre/article/details/53314599