java获取线程池_Java线程池获取任务时的问题?

是并发的。Java线程池是一个很重要的思想,也很重要,是工作和面试中常见的问题。

下面就看下源码在这块的实现:

每个线程启动之后主要就是不断循环判断是不是有任务要做,下面是jdk1.8线程池从队列中取数据的源码。

public void run() {

runWorker(this);

}

final void runWorker(Worker w) {

//...

//关注一下getTask的方法

while (task != null || (task = getTask()) != null) {

w.lock();

}

//...

}

private Runnable getTask() {

//...

for (;;) {

//...

Runnable r = timed ?

workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) :

workQueue.take();//阻塞队列

//...

}

}

从上面可以看到每个线程都是不断去获取任务的,所以是并发执行的。

如果你是觉得并发执行怎么保证线程安全的,可以关注另外一个知识点--阻塞队列,也就是上面代码中workQueue的类型。

至于题主说的源码看不懂的问题,实际上看源码有时候是很枯燥的,这个过程需要很大的耐心。当然看源码的时候,也是有些技巧的,我说点我的经验把。

1.一般会先拿一个场景跑通,然后核心方法的调用过程梳理(不需要把每行代码都看完,一般都是先理主干);

2.有时候接口的实现,我们也不知道怎么调用的。这个时候可以debug查看堆栈的调用链信息,这个使用idea工具在线调试就行。

3.dubug的时候设置条件断点(break point)和计算值(evaluate)有时候能加快调试节奏,有必要的话可以掌握。

之前在看jdk的时候,写了一份jdk的源码的学习笔记,如果有需要可以自取哈,祝好。https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzI0NTgyODEyNA==&action=getalbum&album_id=1343746341864013825#wechat_redirect​mp.weixin.qq.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值