「这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战」
Future接口
boolean cancel(boolean mayInterruptIfRunning)
取消一个任务,并返回取消结果.参数表示是否中断线程boolean isCancelled()
判断任务是否被取消boolean isDone()
判断当前任务是否执行完毕(包括执行完毕,执行异常或者任务取消)V get()
获取任务执行结果,任务结束之前会阻塞V get(long timeout, TimeUnit unit)
指定时间内尝试获取执行结果,超时抛出异常
如何创建futureTask任务
// 创建futureTask
FutureTask<Integer> task = new FutureTask(()->{
System.out.println("线程正在执行");
Thread.sleep(3000);
System.out.println("线程执行结束");
return 1;
});
// 调用多线程执行futrueTask
new Thread(task).start();
复制代码
get方法会阻塞直到任务完成
// 调用多线程执行futrueTask
new Thread(task).start();
System.out.println("干点别的事");
// 获取执行结果,任务结束之前会在此阻塞
System.out.println(task.get());
System.out.println("事情结束");
复制代码
输出顺序
1.先输出"线程正在执行"和"干点别的事"
2.等待3秒后,输出"线程执行结束",然后任务完成,输出get()方法结果1.
3.输出"事情结束"
FutureTask
继承结构.同时继实现了Runnable,因此可以直接当Runnable使用
成员变量
状态变量
state
: 对象状态,volatile保证内存可见性.
private volatile int state;
private static final int NEW = 0; // 任务新建和执行中
private static final int COMPLETING = 1; // 任务将要执行完毕
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; // 执行任务的线程
private volatile WaitNode waiters; // 等待节点,关联等待线程
private static final sun.misc.Unsafe UNSAFE; // 配合线面三个偏移量作CAS操作
private static final long stateOffset; // state字段的内存偏移量
private static final long runnerOffset; // runner字段的内存偏移量
private static final long waitersOffset; // waiters字段的内存偏移量
复制代码