前言:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?在Java中可以通过线程池来达到这样的效果
1.创建java原生线程池的四种方式
//创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(new Test("1"));
executorService.execute(new Test("2"));
executorService.execute(new Test("3"));
//创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待
ExecutorService executorService1 = Executors.newFixedThreadPool(2);
executorService1.execute(new Test("1"));
executorService1.execute(new Test("2"));
executorService1.execute(new Test("3"));
// 创建一个定长线程池,支持定时及周期性任务执行。
ExecutorService executorService2 = Executors.newScheduledThreadPool(2);
executorService2.execute(new Test("1"));
executorService2.execute(new Test("2"));
executorService2.execute(new Test("3"));
//创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行
ExecutorService executorService3 = Executors.newSingleThreadExecutor();
executorService3.execute(new Test("1"));
executorService3.execute(new Test("2"));
executorService3.execute(new Test("3"));
2.创建Spring线程池的方式
@Bean
public ThreadPoolTaskExecutor createThreadPoolTaskExecutor() {
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setCorePoolSize(10);
threadPoolTaskExecutor.setMaxPoolSize(20);
return threadPoolTaskExecutor;
}
@注入 taskExecutor
taskExecutor.execute(new Test("3"));