java线程池之newScheduledThreadPool
程序员文章站
2022-05-16 18:44:03
...
1、特点:
延时启动 、定时启动 、可以自定义最大线程池数量
2、创建实例:
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);
这里如果没有特殊需求要指定最大线程池数量的话,建议最大线程池数量=运行程序机器的cpu核心数,即
int cpuNubmer = Runtime.getRuntime().availableProcessors();
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(cpuNubmer);
3、延时运行举例
这里需要用匿名内部类的方式,实现Runnable接口,重写Runnable的run方法,将Runnable类型的参数传入schedule方法中。
final SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(1);
System.out.println("提交时间: " + sdf.format(new Date()));
scheduledThreadPool.schedule(new Runnable() {
@Override
public void run() {
System.out.println("运行时间: " + sdf.format(new Date()));
}
}, 3, TimeUnit.SECONDS);//延迟3秒执行
scheduledThreadPool.shutdown();
另一种写法比较简单,用lambda表达式的写法
final SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(1);
System.out.println("提交时间: " + sdf.format(new Date()));
scheduledThreadPool.schedule(() -> System.out.println("运行时间: " + sdf.format(new Date())), 3, TimeUnit.SECONDS);
scheduledThreadPool.shutdown();
4、周期运行举例
final SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(1);
scheduledThreadPool.scheduleAtFixedRate(() -> {
System.out.println("运行时间: " + sdf.format(new Date()));
}, 2, 1, TimeUnit.SECONDS);//scheduleAtFixedRate方法,延迟2秒钟后每隔1秒执行一次任务
Thread.sleep(6000);//这里需要让主线程等着
scheduledThreadPool.shutdown();
这里想让自线程执行多久,就得让主线程等多久,如果不清楚子线程需要多久执行完成,那么需要自线程执行的时候告诉主线程“等我执行完你再运行”,子线程执行完后再告诉主线程“我执行完了,你可以继续运行了”,这个需要借助CountDownLatch计数器来实现。
CountDownLatch cdl = new CountDownLatch(3);//创建线程计数器
final SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);
scheduledThreadPool.scheduleAtFixedRate(() -> {
System.out.println("运行时间: " + sdf.format(new Date()));
cdl.countDown();
}, 2, 1, TimeUnit.SECONDS);
cdl.await();
scheduledThreadPool.shutdown();
上一篇: vue常用指令复习总结
下一篇: 豆浆怎么喝,由你来决定