JAVA线程池实现原理 深入解析Java线程池的工作原理
导读:JAVA线程池实现原理,一篇很详细的教程是关于JAVA线程池实现原理的相关知识,一起来看看吧! 1、任务在提交的时候, 首先判断核心线程数是否已满,如果没有满则直接添加到工作线程执行
JAVA线程池实现原理
一篇很详细的教程是关于JAVA线程池实现原理的相关知识,一起来看看吧!
1、任务在提交的时候,首先判断核心线程数是否已满,如果没有满则直接添加到工作线程执行
2、如果核心线程数满了,则判断阻塞队列是否已满,如果没有满,当前任务存入阻塞队列
3、如果阻塞队列也满了,则判断线程数是否小于最大线程数,如果满足条件,则使用临时线程执行任务如果核心或临时线程执行完成任务后会检查阻塞队列中是否有需要执行的线程,如果有,则使用非核心线程执行任务
4、如果所有线程都在忙着(核心线程+临时线程),则走拒绝策略

拒绝策略有哪些?
- 1.AbortPolicy:直接抛出异常,默认策略
- 2.CallerRunsPolicy:用调用者所在的线程来执行任务
- 3.DiscardOldestPolicy:丢弃阻塞队列中靠最前的任务,并执行当前任务
- 4.DiscardPolicy:直接丢弃任务
案例:
public class TestThreadPoolExecutor {
static class MyTask implements Runnable {
private final String name;
private final long duration;
public MyTask(String name) {
this(name, 0);
}
public MyTask(String name, long duration) {
this.name = name;
this.duration = duration;
}
@Override
public void run() {
try {
LoggerUtils.get("myThread").debug("running..." + this);
Thread.sleep(duration);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public String toString() {
return "MyTask(" + name + ")";
}
}
public static void main(String[] args) throws InterruptedException {
AtomicInteger c = new AtomicInteger(1);
ArrayBlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(2);
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
2,
3,
0,
TimeUnit.MILLISECONDS,
queue,
r -> new Thread(r, "myThread" + c.getAndIncrement()),
new ThreadPoolExecutor.AbortPolicy());
showState(queue, threadPool);
threadPool.submit(new MyTask("1", 3600000));
showState(queue, threadPool);
threadPool.submit(new MyTask("2", 3600000));
showState(queue, threadPool);
threadPool.submit(new MyTask("3"));
showState(queue, threadPool);
threadPool.submit(new MyTask("4"));
showState(queue, threadPool);
threadPool.submit(new MyTask("5",3600000));
showState(queue, threadPool);
threadPool.submit(new MyTask("6"));
showState(queue, threadPool);
}
private static void showState(ArrayBlockingQueue<Runnable> queue, ThreadPoolExecutor threadPool) {
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
List<Object> tasks = new ArrayList<>();
for (Runnable runnable : queue) {
try {
Field callable = FutureTask.class.getDeclaredField("callable");
callable.setAccessible(true);
Object adapter = callable.get(runnable);
Class<?> clazz = Class.forName("java.util.concurrent.Executors$RunnableAdapter");
Field task = clazz.getDeclaredField("task");
task.setAccessible(true);
Object o = task.get(adapter);
tasks.add(o);
} catch (Exception e) {
e.printStackTrace();
}
}
LoggerUtils.main.debug("pool size: {}, queue: {}", threadPool.getPoolSize(), tasks);
}
}
上述就是JAVA线程池实现原理的相关内容,供网友参考,希望能解决您的问题。
相关阅读
-
2023中考录取通知书查询官网 成绩查询入口网站
正文核心介绍:2023中考录取通知书查询官网和成绩查询入口网站方面的讲解,具体介绍如下: 2021中考志愿填报结束,录取结果就是家长们最重视的事了。录取结果什么时候出来?在哪里可以
-
网站静态模板怎么做 web静态网页模板
全面的为大家介绍网站静态模板怎么做和web静态网页模板的相关知识,接下来IT袋小编就来介绍。 相信大家应该都知道在整个网站的制作过程当中,网页制作是整个网站建设的重中之重。创建
-
什么是微服务、容器和Kubernetes
今日重点为您介绍什么是微服务、容器和Kubernetes的电脑方面的小经验,下面IT袋网为您详细介绍 什么是微服务? 什么是微服务?你应该使用微服务吗?微服务与容器和 Kubernetes 有什么关系?
-
做电影网站的技巧有哪些 html电影网页制作步骤
一个电脑小知识,为大家介绍做电影网站的技巧有哪些和html电影网页制作步骤的话题,很不错的方法小知识,建议收藏哦! 萌新如何一天打造一个电影网站? 对于网站制作,我是一个萌新,不


