线程池(二)

59 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情

大家好,我是尚影嫣🌷,一名Java后端程序媛。如果您喜欢我的文章,欢迎点赞➕关注❤️,让我们一起成为更好的我们~

线程池 Executors

上一篇已经介绍了缓存线程池和定长线程池,接下来聊聊单线程线程池和周期性任务定长线程池。

1. 单线程线程池

执行流程

  1. 判断线程池的那个线程是否空闲
  2. 空闲则使用
  3. 不空闲则等待它空闲后再使用
package yanf.thread;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


public class day11{
    /*单线程线程池
    
    **/
    public static void main(String[] args) {
        ExecutorService service = Executors.newSingleThreadExecutor();
        service.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "锄禾日当午");
            }
        });
        service.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "锄禾日当午");
            }
        });
        service.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "锄禾日当午");
            }
        });
    }
}

2. 周期性任务定长线程池

执行流程

  1. 判断线程池是否存在空闲线程;
  2. 存在则使用;
  3. 不存在空闲线程,且线程池未满的情况下,则创建线程,并放入线程池中再使用;
  4. 不存在空闲线程,且线程池已满的情况下 则等待线程池的空闲线程;
  5. 周期性任务执行时,定时执行。当某个任务触发时,自动执行某任务。
package yanf.thread;


import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;


public class day11 {
    /*
     *周期任务  定长线程池
    */
    public static void main(String[] args) {
        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2);
        //定时执行一次
        //参数1:定时执行的任务
        //参数2:时长数字
        //参数3:2的时间单位    Timeunit的常量指定
        scheduledExecutorService.schedule(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "锄禾日当午");
            }
        }, 5, TimeUnit.SECONDS);      //5秒钟后执行

        /*
        周期性执行任务
            参数1:任务
            参数2:延迟时长数字(第一次在执行上面时间以后)
            参数3:周期时长数字(没隔多久执行一次)
            参数4:时长数字的单位
        */
        scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "锄禾日当午");
            }
        }, 5, 1, TimeUnit.SECONDS);
    }
}