ScheduledThreadPool的作用
创建一个数量固定的线程池,用来执行定时或周期性任务。
示例代码
public class TestMain {
//格式化
static SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//AtomicInteger用来计数
static AtomicInteger number = new AtomicInteger();
public static void main(String[] args) throws Exception {
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(2);
for (int i = 0; i < 3; i++) {
executorService.schedule(new Runnable() {
@Override
public void run() {
System.out.println("第" + number.incrementAndGet() + "周期线程运行当前时间【" + sim.format(new Date()) + "】");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, 3L, TimeUnit.SECONDS);
}
System.out.println("主线程运行当前时间【" + sim.format(new Date()) + "】");
}
}
运行结果:
总结
可以看到周期线程是在主线程时间3秒后执行的,而由于核心线程只设置了2个,所以第三个任务一样需要等待3秒后,有了空闲线程才能执行。要注意的是第一个3秒间隔是我们设置的延时3秒,之后的3秒都是线程任务里设置的睡眠时间了。