FutureTask

  1. 我们实现 Callable 接口,在覆写的 call 方法中定义需要执行的业务逻辑;

  2. 然后把我们实现的 Callable 接口实现对象传给 FutureTask,然后 FutureTask 作为异步任务提交给线程执行;

  3. 最重要的是 FutureTask 内部维护了一个状态 state,任何操作(异步任务正常结束与否还是被取消)都是围绕着这个状态进行,并随时更新 state 任务的状态;

  4. 只能有一个线程执行异步任务,当异步任务执行结束后,此时可能正常结束,异常结束或被取消。

  5. 可以多个线程并发获取异步任务执行结果,当异步任务还未执行完,此时获取异步任务的线程将加入线程等待列表进行等待;

  6. 当异步任务线程执行结束后,此时会唤醒获取异步任务执行结果的线程,注意唤醒顺序是 “后进先出” 即后面加入的阻塞线程先被唤醒。

  7. 当我们调用 FutureTask.cancel 方法时并不能真正停止执行异步任务的线程,只是发出中断线程的信号。但是只要 cancel 方法返回 true,此时即使异步任务能正常执行完,此时我们调用 get 方法获取结果时依然会抛出 CancellationException 异常。

  1. 利用 LockSupport 来实现线程的阻塞 \ 唤醒机制;
  2. 利用 volatile 和 UNSAFE 的 CAS 方法来实现线程共享变量的无锁化操作;
  3. 若要编写超时异常的逻辑可以参考 FutureTask 的 get(long timeout, TimeUnit unit) 的实现逻辑;
  4. 多线程获取某一成员变量结果时若需要等待时的线程等待链表的逻辑实现;
  5. 某一异步任务在某一时刻只能由单一线程执行的逻辑实现;
  6. FutureTask 中的任务状态 state 的变化处理的逻辑实现。