参考线程池源码,用100行代码写一个线程池 | Java Debug笔记

本文正在参加「Java主题月 – Java Debug笔记活动」,概略查看 活动链接

个人啰嗦

我把一篇文章劈成7篇,走运的是,它们都活了下来,并参加了的Java 笔记debug活动。听闻假定再次把它合到一起,可能会变成一个switch。但我发现它们合在一起成功率只需0.0001。

前言

网上的对线程池源码的剖析太多了,这儿就不说原理了笔记本电脑连不上无线网怎样回事。直接参看它写一个简略的线程池吧。我记得google 的volley 写笔记本电脑连不上无线网怎样回事的更简略googleplay暴力,就直接for循环出来几个线程,然后堵塞读取使命。

开始按部就班….记得点赞额(⊙o⊙)源码编辑器手机版下载

激烈建线程池面试题议先看前面这两文章

敲关键

Java运算符扫盲

JAVA线程池源码之深入状况值剖析

先画个流程图

我们按照流程图,编写代码。

参阅线程池源码,用100行代码写一个线程池 | Java Debug笔记

中心线程处理类

我们先界说几个变量。ThreadPoolExecutor中是用AtomicInteger笔记本cpu天梯图,代表线程状况和在工源码交易网站源码作线程数 ,意图是google翻译为了削减锁的比赛。简略起见就不了。
待我再写一篇文章吧!这个状况java环境变量装备有点意思。

/**
* 最大使命数量,跨越就不进源码编辑器编程猫下载部队。
*/
private final int maximumPoolSize;
/**
*中心线程数,默许值3
*/
private volatile int threadSize = 3;
/笔记本电脑连不上无线网怎样回事**
* 使命堵塞部队
*/
private final Blockin线程池原理gQueue<Runnable> w源码编辑器orkQueue;
/**
* 记载现在作业的线程数
*/
private final Ajava初学tomicInteger threadCount = new AtomicInteger(笔记本电脑排名前十0);

处理使命

这儿分三步线程是什么意思走:

新建线程

startThread(count);

假定现在在作业线线程是什么意思程,java开发没有抵达最大,就持续新笔记本cpu天梯图建线程

增加使命

workQue线程池面试题ue.add(task);

假定使命java怎样读部队未满,就入队。已满,就是使命数源码编辑器手机版下载现已抵达maximumPoolSize最java面试题大值,就回绝源码之家入队。

取使命

workQueue.take(); 这个下面细说。

这儿没有写线程收回,ThreadPoolExecutorallowCoreThreadTime线程安全Out 默许也是不收回的, 可见占用的系统资源java开发很少, 应该还没有你一再创建线程的和收回耗费。 因为通常将处于堵塞状况的进java环境变量装备程排成一个部队,
称为堵塞部队。在有的系统中, 按堵塞的原因不同而将处于堵塞状况的进程排成多个部队。


/**
* 新建线程和增加使命
* @param task
*/
pjava面试题ublic void execute(Runnable task) {
//判别当前线程,是否发动到最大。(threadSize)
if (thread笔记本电脑连不上无线网怎样回事Count.get() < threadSize) {
int count = threadCount.incrementAndGet();
System.out.println("count:" + cjava就业培训班ount);
//发动多个线程去取使命。中心也在这儿。
startThread(count);
}
int wo笔记本电脑开不了机rkQueueSize=workQueue.size();
if(workQueueSize>maximumPoolSize){
Syst源码编辑器手机版下载em.out.prigoogle谷歌搜索主页ntln("跨越最大使命数,回绝增加使命。thread Count:"+workQueueSize);
return;
}
System.out.println("thread Count:" + threadCount.get());
//增加使命,提示:假定部队跨越界说部队巨细,笔记本电脑性价比排行 Queue full 会抛出反常。
workQueue.add(task);
}

取出使命和处理使命

中心在于 workQueue.take()线程安全;,死循环去取使命,没有使命就堵塞。

取出使命后,调用task.run(),处理使命。


Thread thread = new源码之家 Thread() {
@Override
public void run() {
super.run();
while (true) {
try {
//没有使命就堵塞,这儿用BlockingQuegoogle翻译ue,具体看你传递过来的类型。
Runnabl线程池面试题e task = workQueue.take();
System.out.println("workQueue size:"+workQueue.size() + "::" +笔记本电脑排名前十 getName() + "--:" + task.toString());
//模仿处理使命,和耗时。
task.run();
} catch (java面试题Exception e) {
e.pri源码本钱ntStackTrace();
}
}
}
};
t线程安全hread.setName("tag:" + nameTag);
thread.start();

到此,中心代码就全部编写完成了。是不是很简略。去掉注释,目测不到源码之家五十行。

检验类的代码

来让我们源码编辑器手机版下载编写检验类的代码:

界说中心线程数为3

界说最大使命数为10,设置小,为了便当调查回绝使命的增加。

堵塞部队为 LinkedBlockingQueue,且无界。

线程的几种状况束撒花。


SimpleThreadPoolExecutor executor=new SimpleThreadPoolExecutor(3,10,new LinkedBlockingQueue<>());
//增加一个使命
executor.e线程安全xecute(() -> {
//模仿耗时处理使命
processTask();
});
/**
* 模仿处理使命
*/
private static voi线程池的七个参数d processTask() {
//随机休眠
int sleep = new Random().nextgoogle空间Int(10) * 1000;
Syst笔记本电脑排名前十em.out.println("模仿处理使命耗时:"+sleep);
try {
Thread.sleep(sleep);
} catch (InterruptedException e) {
e.prinjava难学吗tStackTrace();
}
}

源码地址

源码地址,简略的线程池

总结

好了现在你也会手写一个简略的线程池了, 虽然简略,这不麻雀虽小,但五脏俱全。

自己知识有限,如有描绘错误之处,愿虎正。

你看这个参阅线程池源码,用100行代码写一个线程池 | Java Debug笔记像不像你欠我的赞。

发表评论

提供最优质的资源集合

立即查看 了解详情