我是靠谱客的博主 土豪酸奶,最近开发中收集的这篇文章主要介绍【线程与线程池】-线程池-execute源码1.看代码2.运行结果3.结果分析4.execute源码流程图5.总结,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
文章目录
- 1.看代码
- 2.运行结果
- 3.结果分析
- 4.execute源码流程图
- 5.总结
1.看代码
public class ThreadPoolDemo {
public static void main(String[] args){
Long start = System.currentTimeMillis();
ThreadPoolExecutor threadPoolExecutor=new ThreadPoolExecutor(10,20,
0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(10));//自定义线程
for (int i =1;i<=100;i++){
threadPoolExecutor.execute(new MyTask(i));
}
}
static class MyTask implements Runnable {
int i =0;
public MyTask(int i) {
this.i = i;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"程序员做第"+i+"个项目");
//业务逻辑
try {
Thread.sleep(3000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
2.运行结果
pool-4-thread-1程序员做第1个项目
pool-4-thread-2程序员做第2个项目
pool-4-thread-3程序员做第3个项目
pool-4-thread-4程序员做第4个项目
pool-4-thread-5程序员做第5个项目
pool-4-thread-6程序员做第6个项目
pool-4-thread-7程序员做第7个项目
pool-4-thread-8程序员做第8个项目
pool-4-thread-9程序员做第9个项目
pool-4-thread-10程序员做第10个项目
pool-4-thread-11程序员做第21个项目
pool-4-thread-12程序员做第22个项目
pool-4-thread-13程序员做第23个项目
pool-4-thread-14程序员做第24个项目
pool-4-thread-15程序员做第25个项目
pool-4-thread-16程序员做第26个项目
pool-4-thread-17程序员做第27个项目
pool-4-thread-18程序员做第28个项目
pool-4-thread-19程序员做第29个项目
pool-4-thread-20程序员做第30个项目
java.util.concurrent.RejectedExecutionException: Task com.example.demo.thread.ThreadPoolDemo$MyTask@c4437c4 rejected from java.util.concurrent.ThreadPoolExecutor@433c675d[Running, pool size = 20, active threads = 20, queued tasks = 10, completed tasks = 0]
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063)
at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379)
at com.example.demo.thread.ThreadPoolDemo.main(ThreadPoolDemo.java:22)
pool-4-thread-5程序员做第12个项目
pool-4-thread-12程序员做第19个项目
pool-4-thread-10程序员做第16个项目
pool-4-thread-13程序员做第17个项目
pool-4-thread-11程序员做第18个项目
pool-4-thread-6程序员做第13个项目
pool-4-thread-9程序员做第15个项目
pool-4-thread-7程序员做第14个项目
pool-4-thread-3程序员做第11个项目
pool-4-thread-4程序员做第20个项目
3.结果分析
从运行结果上可以看出,线程池先执行了任务1-10,再执行了任务21-30,最后才执行了任务11-20,在任务31的时候抛出了异常
这是为什么呢?
我们来看execute源码
public void execute(Runnable command) {
if (command == null)
throw new NullPointerException();
int c = ctl.get();
if (workerCountOf(c) < corePoolSize) {
if (addWorker(command, true))
return;
c = ctl.get();
}
if (isRunning(c) && workQueue.offer(command)) {
int recheck = ctl.get();
if (! isRunning(recheck) && remove(command))
reject(command);
else if (workerCountOf(recheck) == 0)
addWorker(null, false);
}
else if (!addWorker(command, false))
reject(command);
}
a. 第1-10个任务来
if (workerCountOf© < corePoolSize)
先判断核心员工有没有招够( 目前线程数是不是小于核心线程数),如果没有就addWorker(command, true) 招聘一个核心员工,招聘成功则return
b. 第11-20个任务来
if (isRunning© && workQueue.offer(command))
判断线程是否在运行,如果还在运行加入队列,此处有双重检测,如果线程已不是运行状态则删除
c. 第21-30个任务来
else if (!addWorker(command, false)) 新增临时员工,如果能添加成功则添加,如果不能添加成功则调用拒绝方法
d.第31- 个任务来
调用 reject(command); 任务则被拒绝
4.execute源码流程图
5.总结
好记性不如烂笔头,知道不如做到。
最后
以上就是土豪酸奶为你收集整理的【线程与线程池】-线程池-execute源码1.看代码2.运行结果3.结果分析4.execute源码流程图5.总结的全部内容,希望文章能够帮你解决【线程与线程池】-线程池-execute源码1.看代码2.运行结果3.结果分析4.execute源码流程图5.总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复