摘要:
1.介绍 shutdown()方法中会通过interruptIdleWorkers()中断所有的空闲线程, 这个时候有可能有非空闲的线程在执行某个任务,执行任务完毕之后, 如果它刚好是核心线程,就会在下一轮循环阻塞在任务队列的take()方法, 如果不 做额外的干预,它甚至会在线程池关闭之后永久阻塞 阅读全文
摘要:
1.介绍 每个工作线程终结的时候都会调用tryTerminate()方法 2.源码 final void tryTerminate() { for (;;) { int c = ctl.get(); // 判断线程池的状态,如果是下面三种情况下的任意一种则直接返回: // 1.线程池处于RUNNIN 阅读全文
摘要:
1.介绍 processWorkerExit()方法是为将要终结的Worker做一次清理和数据记录工作 (因为processWorkerExit()方法也包裹在runWorker()方法finally代码块中, 其实工作线程在执行完processWorkerExit()方法才算真正的终结)。 2.源 阅读全文
摘要:
1.介绍 getTask()方法是工作线程在while死循环中获取任务队列中的任务对象的方法 2.源码 private Runnable getTask() { // 记录上一次从队列中拉取的时候是否超时 boolean timedOut = false; // Did the last poll( 阅读全文
摘要:
1.介绍 线程池中的每一个具体的工作线程被包装为内部类Worker实例, Worker继承于AbstractQueuedSynchronizer(AQS),实现了Runnable接口 2.实现了Runnable接口 private final class Worker extends Abstrac 阅读全文
摘要:
1.方法:boolean addWorker(Runnable firstTask, boolean core) 方法的第一的参数可以用于直接传入任务实例, 第二个参数用于标识将要创建的工作线程是否核心线程。 2.方法源码 // 添加工作线程,如果返回false说明没有新创建工作线程,如果返回tru 阅读全文
摘要:
1.execute方法源码分析 线程池异步执行任务的方法实现是ThreadPoolExecutor#execute(),源码如下: // 执行命令,其中命令(下面称任务)对象是Runnable的实例 public void execute(Runnable command) { // 判断命令(任务 阅读全文
摘要:
1.线程池的状态常量,这里只详细分析其中一个,其他类同,这里看RUNNING状态: // -1的补码为:111-11111111111111111111111111111 // 左移29位后:111-00000000000000000000000000000 // 10进制值为:-536870912 阅读全文
摘要:
byte: byte数据类型是8位、有符号的,以二进制补码表示的整数;(256个数字),占1字节 最小值是-128(-2^7); 最大值是127(2^7-1); 默认值是0; byte类型用在大型数组中节约空间,主要代替整数,因为byte变量占用的空间只有int类型的四分之一; 例子:byte a 阅读全文
摘要:
1.状态控制 状态控制主要围绕原子整型成员变量ctl: private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); private static final int COUNT_BITS = Integer.SIZE 阅读全文
摘要:
1.设计者(Doug Lea) 2.ThreadPoolExecutor实现的最顶层接口 public interface Executor { void execute(Runnable command); } 说明:ExecutorService提供了很多扩展方法底层基本上是基于Executor 阅读全文