一. 线程池的构造方法
public ThreadPoolExecutor(
//核心池大小
int corePoolSize,
//最大线程数量
int maximumPoolSize,
//线程空闲时最大存活时间
long keepAliveTime,
//时间单位
TimeUnit unit,
//阻塞队列,也叫任务缓存队列
BlockingQueue<Runnable> workQueue,
//线程工厂,生产线程
ThreadFactory threadFactory,
//任务拒绝策略
RejectedExecutionHandler handler){}
二. 实例
1. 代码
public class ThreadTest extends Thread {
private int i;
public ThreadTest(int i){
this.i = i;
}
@Override
public void run() {
System.out.println("正在执行"+ i + "任务...");
}
}
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class ThreadPoolTest {
public static void main(String[] args) {
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, 15, 1l, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(5));
for (int i = 0; i < 18; i++) {
ThreadTest threadTest = new ThreadTest(i);
threadPoolExecutor.execute(threadTest);
System.out.println("线程池中的线程数目:" + threadPoolExecutor.getPoolSize());
System.out.println("队列等待执行的任务数目:" + threadPoolExecutor.getQueue().size());
System.out.println(" 执行完毕的线程数目:" + threadPoolExecutor.getCompletedTaskCount());
}
threadPoolExecutor.shutdown();
}
}
2. 运行结果
线程池中的线程数目:1
队列等待执行的任务数目:0
执行完毕的线程数目:0
线程池中的线程数目:2
队列等待执行的任务数目:0
执行完毕的线程数目:0
线程池中的线程数目:3
队列等待执行的任务数目:0
执行完毕的线程数目:0
线程池中的线程数目:4
队列等待执行的任务数目:0
执行完毕的线程数目:0
线程池中的线程数目:5
队列等待执行的任务数目:0
执行完毕的线程数目:0
线程池中的线程数目:6
队列等待执行的任务数目:0
执行完毕的线程数目:0
线程池中的线程数目:7
队列等待执行的任务数目:0
执行完毕的线程数目:0
线程池中的线程数目:8
队列等待执行的任务数目:0
执行完毕的线程数目:0
线程池中的线程数目:9
队列等待执行的任务数目:0
执行完毕的线程数目:0
线程池中的线程数目:10
队列等待执行的任务数目:0
执行完毕的线程数目:0
线程池中的线程数目:10
队列等待执行的任务数目:1
执行完毕的线程数目:0
线程池中的线程数目:10
队列等待执行的任务数目:2
执行完毕的线程数目:0
线程池中的线程数目:10
队列等待执行的任务数目:3
执行完毕的线程数目:0
线程池中的线程数目:10
队列等待执行的任务数目:4
执行完毕的线程数目:0
线程池中的线程数目:10
队列等待执行的任务数目:5
执行完毕的线程数目:0
线程池中的线程数目:11
队列等待执行的任务数目:5
执行完毕的线程数目:0
线程池中的线程数目:12
队列等待执行的任务数目:5
执行完毕的线程数目:0
线程池中的线程数目:13
队列等待执行的任务数目:5
执行完毕的线程数目:0
正在执行0任务...
正在执行10任务...
正在执行11任务...
正在执行12任务...
正在执行13任务...
正在执行14任务...
正在执行1任务...
正在执行3任务...
正在执行2任务...
正在执行4任务...
正在执行5任务...
正在执行6任务...
正在执行7任务...
正在执行8任务...
正在执行9任务...
正在执行15任务...
正在执行16任务...
正在执行17任务...
Process finished with exit code 0
三. 总结
1. 当线程池中的线程数量小于或等于核心池大小时,每来一个新任务线程池会创建一个线程去执行它
2. 当线程池中的线程数量大于核心池大小时,每来一个新任务,线程池会将新任务加入到缓存队列中去。如果添加成功,则任务等待线程执行;如果添加失败,则线程池创建新的线程去执行这个任务。
3. 当线程池中的线程数目大于maximumPoolSize时,线程池拒绝再添加新的线程,反而采用线程拒绝策略拒绝任务执行。
1281

被折叠的 条评论
为什么被折叠?



