实例代码
- ExecutorService executor = Executors.newSingleThreadExecutor();
- for (int i = 0; i < 5; i++) {
- executor.execute(() -> {
- System.out.println(Thread.currentThread().getName()+"正在执行");
- });
- }
- 复制代码
运行结果:
使用场景
适用于串行执行任务的场景,一个任务一个任务地执行。
newScheduledThreadPool
- public ScheduledThreadPoolExecutor(int corePoolSize) {
- super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
- new DelayedWorkQueue());
- }
- 复制代码
线程池特点
- 最大线程数为Integer.MAX_VALUE
- 阻塞队列是DelayedWorkQueue
- keepAliveTime为0
- scheduleAtFixedRate() :按某种速率周期执行
- scheduleWithFixedDelay():在某个延迟后执行
工作机制
- 添加一个任务
- 线程池中的线程从 DelayQueue 中取任务
- 线程从 DelayQueue 中获取 time 大于等于当前时间的task
- 执行完后修改这个 task 的 time 为下次被执行的时间
- 这个 task 放回DelayQueue队列中
实例代码
- /**
- 创建一个给定初始延迟的间隔性的任务,之后的下次执行时间是上一次任务从执行到结束所需要的时间+* 给定的间隔时间
- */
- ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
- scheduledExecutorService.scheduleWithFixedDelay(()->{
- System.out.println("current Time" + System.currentTimeMillis());
- System.out.println(Thread.currentThread().getName()+"正在执行");
- }, 1, 3, TimeUnit.SECONDS);
- 复制代码
运行结果:
- /**
- 创建一个给定初始延迟的间隔性的任务,之后的每次任务执行时间为 初始延迟 + N * delay(间隔)
- */
- ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
- scheduledExecutorService.scheduleAtFixedRate(()->{
- System.out.println("current Time" + System.currentTimeMillis());
- System.out.println(Thread.currentThread().getName()+"正在执行");
- }, 1, 3, TimeUnit.SECONDS);;
- 复制代码
使用场景
周期性执行任务的场景,需要限制线程数量的场景
回到面试题:说说几种常见的线程池及使用场景?
回答这四种经典线程池 :newFixedThreadPool,newSingleThreadExecutor,newCachedThreadPool,newScheduledThreadPool,分线程池特点,工作机制,使用场景分开描述,再分析可能存在的问题,比如newFixedThreadPool内存飙升问题 即可
线程池状态
线程池有这几个状态:RUNNING,SHUTDOWN,STOP,TIDYING,TERMINATED。
- //线程池状态
- private static final int RUNNING = -1 << COUNT_BITS;
- private static final int SHUTDOWN = 0 << COUNT_BITS;
- private static final int STOP = 1 << COUNT_BITS;
- private static final int TIDYING = 2 << COUNT_BITS;
- private static final int TERMINATED = 3 << COUNT_BITS;
- 复制代码
线程池各个状态切换图:
(编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|