/images/avatar.png

FutureTask源码学习

基本属性

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  	/* Possible state transitions:
     * NEW -> COMPLETING -> NORMAL
     * NEW -> COMPLETING -> EXCEPTIONAL
     * NEW -> CANCELLED
     * NEW -> INTERRUPTING -> INTERRUPTED
     */
    private volatile int state; //线程状态
    private static final int NEW          = 0; // 进来未执行的状态
    private static final int COMPLETING   = 1; // 表示正在结束,临时状态,用于结束前cas操作;异常和有结果前都会有
    private static final int NORMAL       = 2; // 正常结束
    private static final int EXCEPTIONAL  = 3; // 异常结束
    private static final int CANCELLED    = 4; // 任务被取消
    private static final int INTERRUPTING = 5; // 中断中 也是临时状态
    private static final int INTERRUPTED  = 6; // 已中断

	// 运行任务
    private Callable<V> callable; 
    // 整个任务周期中 存放值的对象,会有异常或者正常的值
    private Object outcome; 
    // 正在执行任务的线程 
    private volatile Thread runner;
    // get任务阻塞的线程 会存在这个队列里面
    private volatile WaitNode waiters;

SynchronousQueue源码学习

SynchronousQueue 是实现了BlockingQueue的一个队列。特点是SynchronousQueue 没有容器。

在生产者消费者情况下。生产者生产数据后没人消费是会阻塞的。当有消费者消费了,消费者与生产者同时退出队列。

SynchronousQueue 的两种实现方式

  • 公平模式 就是队列 TransferQueue
  • 非公平模式 就是栈 TransferStack