java线程池之newScheduledThreadPool
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();