欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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();

 

相关标签: 程序开发