是并发的。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_redirectmp.weixin.qq.com