schedule
1.schedule方法
schedule方法主要使用延迟或者定时执行一次,在指定时间之后。
在延迟两秒后提交任务,开始任务的执行
package com.cweeyii.threadpool;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
/**
* Created by wenyi on 16/10/16.
* Email:caowenyi@meituan.com
*/
public class ScheduledThreadPool {
private static final Logger LOGGER = LoggerFactory.getLogger(ScheduledThreadPool.class);
public static void main(String[] args) throws ExecutionException, InterruptedException {
testScheduledMethod();
testFixScheduledMethod();
testFixWithScheduledMethod();
}
private static void testScheduledMethod() throws ExecutionException, InterruptedException {
int poolSize = 2;
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(poolSize);
List<Future<CallerHandle>> futureList = new ArrayList<>();
for (int i = 0; i < poolSize * 2; i++) {
futureList.add(executorService.schedule(new CallableWorker(), 2, TimeUnit.SECONDS));
}
executorService.shutdown();
LOGGER.info("线程池已经被关闭");
for (Future<CallerHandle> future : futureList) {
CallerHandle handle = future.get();
LOGGER.info(handle.getThreadName() + "已经完成");
}
LOGGER.info("主线程结束");
}
private static void testFixScheduledMethod() throws ExecutionException, InterruptedException {
int poolSize = 2;
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(poolSize);
for (int i = 0; i < poolSize * 2; i++) {
executorService.scheduleAtFixedRate(new RunableWorker(), 0, 5, TimeUnit.SECONDS);
}
executorService.awaitTermination(10, TimeUnit.SECONDS);
executorService.shutdown();
LOGGER.info("线程池已经被关闭");
LOGGER.info("主线程结束");
}
private static void testFixWithScheduledMethod() throws ExecutionException, InterruptedException {
int poolSize = 2;
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(poolSize);
for (int i = 0; i < poolSize * 2; i++) {
executorService.scheduleWithFixedDelay(new RunableWorker(), 0, 5, TimeUnit.SECONDS);
}
executorService.awaitTermination(10, TimeUnit.SECONDS);
executorService.shutdown();
LOGGER.info("线程池已经被关闭");
LOGGER.info("主线程结束");
}
}
testScheduledMethod结果如下:
22:04:41.017 INFO (ScheduledThreadPool.java:29) - 线程池已经被关闭
22:04:45.023 INFO (CallableWorker.java:20) - pool-1-thread-1 结束任务
22:04:45.024 INFO (CallableWorker.java:20) - pool-1-thread-2 结束任务
22:04:45.026 INFO (ScheduledThreadPool.java:32) - pool-1-thread-1已经完成
22:04:45.027 INFO (ScheduledThreadPool.java:32) - pool-1-thread-2已经完成
22:04:47.029 INFO (CallableWorker.java:20) - pool-1-thread-1 结束任务
22:04:47.029 INFO (CallableWorker.java:20) - pool-1-thread-2 结束任务
22:04:47.029 INFO (ScheduledThreadPool.java:32) - pool-1-thread-1已经完成
22:04:47.030 INFO (ScheduledThreadPool.java:32) - pool-1-thread-2已经完成
22:04:47.030 INFO (ScheduledThreadPool.java:34) - 主线程结束
注意:scheduleAtFixedRate只会同时调度指定线程数量的任务,其他的任务执行时间会延后,但是其调度延迟时间是按照任务执行开始时间进行计算。
testFixScheduledMethod执行结果如下:
22:46:37.313 INFO (RunableWorker.java:27) - pool-1-thread-2 线程处理提交任务完成
22:46:37.313 INFO (RunableWorker.java:27) - pool-1-thread-1 线程处理提交任务完成
22:46:39.318 INFO (RunableWorker.java:27) - pool-1-thread-2 线程处理提交任务完成
22:46:39.324 INFO (RunableWorker.java:27) - pool-1-thread-1 线程处理提交任务完成
22:46:42.316 INFO (RunableWorker.java:27) - pool-1-thread-2 线程处理提交任务完成
22:46:42.316 INFO (RunableWorker.java:27) - pool-1-thread-1 线程处理提交任务完成
22:46:44.321 INFO (RunableWorker.java:27) - pool-1-thread-1 线程处理提交任务完成
22:46:44.321 INFO (RunableWorker.java:27) - pool-1-thread-2 线程处理提交任务完成
22:46:45.311 INFO (ScheduledThreadPool.java:47) - 线程池已经被关闭
22:46:45.312 INFO (ScheduledThreadPool.java:48) - 主线程结束
22:46:47.314 INFO (RunableWorker.java:27) - pool-1-thread-1 线程处理提交任务完成
注意:scheduleWithFixedDelay只会同时调度指定线程数量的任务,其他的任务执行时间会延后,但是其调度延迟时间是按照任务结束时间进行计算。
testFixWithScheduledMethod执行如下:
22:49:50.897 INFO (RunableWorker.java:27) - pool-1-thread-1 线程处理提交任务完成
22:49:50.897 INFO (RunableWorker.java:27) - pool-1-thread-2 线程处理提交任务完成
22:49:52.906 INFO (RunableWorker.java:27) - pool-1-thread-1 线程处理提交任务完成
22:49:52.906 INFO (RunableWorker.java:27) - pool-1-thread-2 线程处理提交任务完成
22:49:57.907 INFO (RunableWorker.java:27) - pool-1-thread-1 线程处理提交任务完成
22:49:57.907 INFO (RunableWorker.java:27) - pool-1-thread-2 线程处理提交任务完成
22:49:58.895 INFO (ScheduledThreadPool.java:59) - 线程池已经被关闭
22:49:58.896 INFO (ScheduledThreadPool.java:60) - 主线程结束
22:49:59.911 INFO (RunableWorker.java:27) - pool-1-thread-2 线程处理提交任务完成
22:49:59.911 INFO (RunableWorker.java:27) - pool-1-thread-1 线程处理提交任务完成