JUC- Callable

112 阅读2分钟

Callabe

与Ruunable接口不同的是Callable接口有返回值,可以抛出异常

使用

  1. 实现Callable接口,实现call方法
  2. 通过FutureTask 调用
public interface Callable<V> {
    //泛型V即返回值的类型
    V call() throws Exception;
}
public class CopyonwriteArraylist_Test {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        Call call=new Call();
        // FutrueTask提供了构造函数 FutureTask(Callable<V> callable) 
        FutureTask futureTask = new FutureTask<>(call);
        new Thread(futureTask,"A").start();//只输出了一次
        new Thread(futureTask,"B").start();//由于状态已经不是new了,直接结束了
        System.out.println(futureTask.get());;
    }
}

class Call implements Callable<Integer>{ 

    @Override
    public Integer call() throws Exception {
        System.out.println("call");
        return null;
    }
}

Future

Future是一个接口,它定义了5个方法:

//取消一个任务,并返回取消结果。参数表示是否中断线程。
boolean cancel(boolean mayInterruptIfRunning);
//判断任务是否被取消
boolean isCancelled();
// 判断当前任务是否执行完毕,包括正常执行完毕、执行异常或者任务取消。
boolean isDone();
//获取任务执行结果,任务结束之前会阻塞。
V get() throws InterruptedException, ExecutionException;
// 在指定时间内尝试获取执行结果。若超时则抛出超时异常 
V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException; 

FutureTask

一个可取消的异步计算。

8AONTWW5%OV`F2.png 参考:blog.csdn.net/qq_39654841…

VQF.png

private static final int NEW          = 0; //表示一个新的任务,初始状态
private static final int COMPLETING   = 1; //当任务被设置结果时,处于COMPLETING状态,这是一个中间状态。
private static final int NORMAL       = 2; //表示任务正常结束。
private static final int EXCEPTIONAL  = 3; //表示任务因异常而结束
private static final int CANCELLED    = 4; //任务还未执行之前就调用了cancel(true)方法,任务处于CANCELLED
private static final int INTERRUPTING = 5; //当任务调用cancel(true)中断程序时,任务处于INTERRUPTING状态,这是一个中间状态。
private static final int INTERRUPTED  = 6; //任务调用cancel(true)中断程序时会调用interrupt()方法中断线程运行,任务状态由INTERRUPTING转变为INTERRUPTED
可能的状态过渡:
 1、NEW -> COMPLETING -> NORMAL:正常结束
 2、NEW -> COMPLETING -> EXCEPTIONAL:异常结束
 3、NEW -> CANCELLED:任务被取消
 4、NEW -> INTERRUPTING -> INTERRUPTED:任务出现中断