我是靠谱客的博主 土豪酸奶,最近开发中收集的这篇文章主要介绍【线程与线程池】-线程池-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.总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部