如何创建Java线程池

1.阅读文章之前,请先对Java线程及线程池做一些简单的了解。

2.线程池的四种创建

//创建一个可以无限创建线程的线程池
ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
//调用
newCachedThreadPool.execute(new Runnable{...});

//创建一个定长线程池,可控制线程并发数,超出线程在队列中等待
ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(2);//并发数为2
//调用
newFixedThreadPool.execute(new Runnable{...});

//创建一个定长线程池,支持定时任务执行
ScheduledExecutorService newScheduledThreadPool = Executors.newScheduledThreadPool(2);
//调用
newScheduledThreadPool.schedule(new Runnable{...},3, TimeUnit.SECONDS);//延迟三秒执行
//延迟三秒执行,且周期为5秒;如执行时间不足5秒,则两次启动时间间隔为5秒,如执行时间超过5秒,则在上次执行结束后直接开始下一次执行
newScheduledThreadPool.scheduleAtFixedRate(new Runnable{...},3,5, TimeUnit.SECONDS);
//延迟三秒执行,且每次执行结束后延迟5秒执行下一次任务
newScheduledThreadPool.scheduleWithFixedDelay(new Runnable{...},3,5, TimeUnit.SECONDS);


//创建一个单线程线程池,按顺序来执行线程任务;但是不同于单线程,这个线程池只是只能存在一个线程,这个线程死后另外一个线程会补上,始终只有一个工作线程
ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor();
//调用
newSingleThreadExecutor.execute(new Runnable{...});

3.自定义创建线程池

private static ExecutorService cachedThreadPool = new ThreadPoolExecutor(intcorePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory,handler);

//参数说明:
intcorePoolSize=1;//线程池的核心线程最大值

maximumPoolSize=5;//线程池能拥有的最大线程数

keepAliveTime=60;//空闲线程的存活时间

unit=TimeUnit.SECONDS;//计时单位 TimeUnit.SECONDS(秒) TimeUnit.MILLISECONDS(毫秒) ...

//阻塞时的队列方式
//直接将任务交给消费者,必须等队列中的添加元素被消费后才能继续添加新的元素
workQueue=new SynchronousQueue<>();
//无界缓存等待队列。
//当前执行的线程数量达到corePoolSize的数量时,剩余的元素会在阻塞队列里等待;在使用此队列时maximumPoolSizes参数无效
workQueue=new LinkedBlockingQueue<>();
//有界缓存等待队列,可以指定缓存队列的大小,
//当正在执行的线程数等于corePoolSize时,多余的元素缓存在ArrayBlockingQueue队列中等待有空闲的线程时继续执行,
//当ArrayBlockingQueue已满时,加入ArrayBlockingQueue失败,会开启新的线程去执行,
//当线程数已经达到最大的maximumPoolSizes时,再有新的元素尝试加入ArrayBlockingQueue时会报错
workQueue=new ArrayBlockingQueue<>(10);

//指定创建线程的工厂,可以不设置,默认值如下:
threadFactory=Executors.defaultThreadFactory();

//线程池对拒绝任务的处理策略;即队列已满且线程数也达到上限,再过来任务时的处理方式
handler=new ThreadPoolExecutor.AbortPolicy();//抛出RejectedExecutionException异常
handler=new ThreadPoolExecutor.CallerRunsPolicy();//由向线程池提交任务的线程来执行该任务
handler=new ThreadPoolExecutor.DiscardOldestPolicy();//抛弃最旧的任务(最先提交而没有得到执行的任务)
handler=new ThreadPoolExecutor.DiscardPolicy();//抛弃当前的任务

4.注解方式创建线程池

//线程池配置
@fongiguration
@EnableAsync
public class AsyncConfig{

    @Bean
    public Executor taskExecutor{
       ThreadPoolTaskExecutor executor=new ThreadPoolTaskExecutor();
       executor.setCorePoolSize(1);
       executor.setMaxPoolSize(5);
       executor.setQueueCapacity(10);
       executor.setKeepAliveSeconds(20);
       executor.setAllowCoreThreadTimeOut(true);//是否允许核心线程空闲退出
       executor.setPejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
       executor.setThreadNamePrefix("justin-async-");//线程名前缀
       executor.initialize();
       return executor;
    }
}
//调用(直接将注解加到方法上面)
@Async
public void test(){...}

《如何创建Java线程池》上有1条评论

发表回复

您的电子邮箱地址不会被公开。

19 + 20 =