Callabe
与Ruunable接口不同的是Callable接口有返回值,可以抛出异常
使用
- 实现Callable接口,实现call方法
- 通过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
一个可取消的异步计算。
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:任务出现中断