线程池
线程池参数:
- corePoolSize :核心线程数
- maximumPoolSize :最大线程数
- keepAliveTime :线程空闲存活时间
- unit :空闲线程存活时间单位
- workQueue :工作队列
- threadFactory :线程工厂
- handler :拒绝策略
四个基本组成部分
- 线程池管理器(ThreaPool)
顾名思义,管理线程池,如创建、销毁线程池或者添加新任务 - 工作线程(PoolWoker)
线程池中的线程,用于循环执行任务,若没有任务则处于等待状态 - 任务接口
任务必须实现的接口,用于工作线程调度任务的执行 - 任务队列
存放还没执行的任务,用于缓冲任务的执行
常用线程池
1、newSingleThreadExecutor
单线程的线程池;线程池中只有一个线程在工作,如果当前线程执行异常停止了,那么线程池会新创建一个线程代替它去执行任务;保证任务的执行顺序按照任务的提交顺序执行
2、newFixedThreadPool
固定大小的线程池;线程数随着任务数增加,如果达到固定线程池固定线程数则不再增加线程。如果再处于最大线程数时有线程异常而结束,则会新建线程补充,保证最大线程数
3、newCacheThreadPool
可缓存线程池;如果线程池长度超过任务数,则可灵活的回收空闲线程;当任务数增加时,可创建新的线程来执行任务;
4、ScheduledThreadPoolExecutor
定长线程池;支持定时和周期性任务执行
- 创建方法:
1. ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
2. ScheduledThreadPoolExecutor exec =new ScheduledThreadPoolExecutor(1);
4.1定时任务线程池的scheduleAtFixedRate和scheduleWithFixedDelay方法区别
4.1.1 scheduleAtFixedRate :
按照固定频率来执行任务;分两种情况:
- 1、任务执行时间 < period ,则任务之间执行间隔时间等于period
public class NewScheduledThreadExecutorTest {
public static void main(String[] args) {
ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);
exec.scheduleAtFixedRate(new Runnable(){//任务执行时间5s, period值为2s
@Override
public void run() {
System.out.println("AtFixedRate-----" + System.currentTimeMillis()/1000);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}}, 1000, 2000, TimeUnit.MILLISECONDS);
}
}
执行时间间隔为2秒,即period的值
- 2、任务执行时间 > period,则任务之间执行间隔时间等于任务执行时间,即任务执行完马上执行下一个任务
public class NewScheduledThreadExecutorTest {
public static void main(String[] args) {
ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);
exec.scheduleAtFixedRate(new Runnable(){//任务执行时间5s, period值为2s
@Override
public void run() {
System.out.println("AtFixedRate-----" + System.currentTimeMillis()/1000);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}}, 1000, 2000, TimeUnit.MILLISECONDS);
}
}
可以看出间隔时间都是5s,即任务的执行时间
4.1.2scheduleWithFixedDelay:
按照固定延迟时间来执行任务,受任务本身执行时间限制
- 比如delay的值是2s;任务执行时间是1s;执行任务时间间隔为3s
public class NewScheduledThreadExecutorTest {
public static void main(String[] args) {
ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);
exec.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
System.out.println("withFixedDelay:" + System.currentTimeMillis()/1000);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, 1000, 1000, TimeUnit.MILLISECONDS);
}
}