future 接口[01]简单实现

「这是我参与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.输出"事情结束"

image.png

FutureTask

继承结构.同时继实现了Runnable,因此可以直接当Runnable使用

image.png

成员变量

状态变量

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字段的内存偏移量
复制代码

Guess you like

Origin juejin.im/post/7032625879238836231