工作中用到了线程池和调度线程相关的知识,记录一下
@Test
public void testThreadPool() throws InterruptedException {
// 错误的创建线程池的方式
ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
// scheduleWithFixedDelay:执行完第一次任务后间隔1秒执行下一次任务
scheduledExecutorService.scheduleWithFixedDelay(() -> {
System.out.println("scheduleWithFixedDelay...");
}, 1, 1, TimeUnit.SECONDS);
// scheduleAtFixedRate:每1秒执行一次任务,即使上一个任务没有完成
scheduledExecutorService.scheduleAtFixedRate(() -> {
System.out.println("scheduleAtFixedRate...");
}, 1, 1, TimeUnit.SECONDS);
// 定义主线程休眠,否则调度线程在主线程结束后无法正常执行
Thread.sleep(1000000000L);
}
@Test
public void testThreadPool() throws InterruptedException {
// 正确的创建线程池的方式(可自定义线程名称,方便排查问题)
ThreadFactory factory =
new ThreadFactoryBuilder().setNameFormat("thread-name-%d").build();
ScheduledExecutorService scheduledExecutorService = new ScheduledThreadPoolExecutor(1, factory,
new ScheduledThreadPoolExecutor.AbortPolicy());
// scheduleWithFixedDelay:执行完第一次任务后间隔1秒执行下一次任务
scheduledExecutorService.scheduleWithFixedDelay(() -> {
System.out.println("scheduleWithFixedDelay...");
}, 1, 1, TimeUnit.SECONDS);
// scheduleAtFixedRate:每1秒执行一次任务,即使上一个任务没有完成
scheduledExecutorService.scheduleAtFixedRate(() -> {
System.out.println("scheduleAtFixedRate...");
}, 1, 1, TimeUnit.SECONDS);
// 定义主线程休眠,否则调度线程在主线程结束后无法正常执行
Thread.sleep(1000000000L);
}
阿里编码规约也禁止使用Executors或者显式创建线程(池),这是优化后的方案