线程池的概念
在java中提供了Executors类, 用来创建线程池, 大体分为如下几类:
-
- 创建一个固定大小的线程池
static ExecutorService newFixedThreadPool(int nThreads);
-
- 创建一个可缓存的线程池(可大可小)
static ExecutorService newCachedThreadPool()
-
- 创建一个定时执行的线程池
- scheduleAtFixedRate()
- scheduleWithFixedDelay()
- 区别:
- scheduleAtFixedRate 固定周期执行, 不管上次的线程执行完成没有
- scheduleWithFixedDelay 固定周期执行, 此方法会等待上次线程执行完成后按照周期执行
static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
-
- 创建一个单线程执行的线程池
static ExecutorService newSingleThreadExecutor()
-
- 创建一个单线程定时执行的线程池
static ScheduledExecutorService newSingleThreadScheduledExecutor()
- 代码如下
public static void testFixedThreadPool() {
//创建固定的线程池,使用3个线程来并发执行提交的任务。底层是个无界队列
ExecutorService executorService = Executors.newFixedThreadPool(6);
executorService.execute(new MyThread());
executorService.execute(new MyRunnable());
executorService.execute(new MyRunnable());
executorService.execute(new MyRunnable());
executorService.execute(new MyThread());
executorService.execute(new MyThread());
}
public static void testCacheThreadPool() {
//创建非固定数量,可缓存的线程池。当提交的任务数量起起伏伏时,会自动创建或者减少执行线程的数量。
//当然,重用线程是线程池的基本特征。
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(new MyThread());
executorService.execute(new MyRunnable());
executorService.execute(new MyRunnable());
executorService.execute(new MyRunnable());
executorService.execute(new MyThread());
}
public static void testScheduledThreadPool(){
//创建一个定时执行线程池
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(30);
//1、配置任务的执行周期
//scheduleAtFixedRate 固定周期执行完毕
//每秒钟会调用MyRunnable任务, 不管这个MyRunnable有没有执行完成, 都是每秒执行
executorService.scheduleAtFixedRate(new MyRunnable(),0,1000,TimeUnit.MILLISECONDS);
//scheduleWithFixedDelay 上一次执行完毕之后下一次开始执行
//每秒钟会调用MyRunnable任务, 当执行下一次任务, 会先上一次的任务有没有执行完成, 如果没有, 先等待, 当上一次的任务执行完成以后, 会等待1秒的时候, 执行下一次请求
executorService.scheduleWithFixedDelay(new MyRunnable(),0,1000,TimeUnit.MILLISECONDS);
}
//----------以下了解即可--------------
public static void testSingleThreadPool() {
//创建单线程,在任务执行时,会依次执行任务。底层是个无界队列。
ExecutorService executorService = Executors.newSingleThreadExecutor();
//由于这个线程池只有一个线程, 所以以下的任务, 会依次执行
executorService.execute(new MyThread());
executorService.execute(new MyRunnable());
executorService.execute(new MyRunnable());
executorService.execute(new MyRunnable());
executorService.execute(new MyThread());
}
public static void testSingleCacheThreadPool(){
//创建一个单个线程执行的定时器
ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
//scheduleAtFixedRate 固定周期执行完毕
//这个也是一个定时执行的线程池, 但是这个线程池中只有一个线程, 如果使用这个方法的话, 那么如果上一个线程没有执行完成, 会直接干掉这个任务吗, 重新执行任务
executorService.scheduleAtFixedRate(new MyRunnable(),0,1000,TimeUnit.MILLISECONDS);
//scheduleWithFixedDelay 上一次执行完毕之后下一次开始执行
executorService.scheduleWithFixedDelay(new MyRunnable(),0,1000,TimeUnit.MILLISECONDS);
}