Future
FutureTask叫未来任务,可以将一个复杂的任务剔除出去交给另外一个线程来完成。
Future类提供了下面这些方法:
1 get()
get方法的行为取决于Callable任务的状态,只有以下5种情况:
- 任务正常完成:get方法会立刻返回结果
- 任务尚未完成:任务还没有开始或进行中,get将阻塞并直到任务完成。
- 任务执行过程中抛出Exception:get方法会抛出ExecutionException,这里抛出异常,是call()执行
时产生的那个异常 - 任务被取消:get方法会抛出CancellationException
- 任务超时:get方法有一个重写方法,是传入一个延迟时间的,如果时间到了还没有获得结果,get方法会抛出TimeoutException
2 get(long timeout,TimeUnit unit)
如果call()在规定时间内完成任务,那么就会正常获取到返回值,而如果在指定时间内没有计算出结果,则会抛出TimeoutException
3 cancel()
- 如果这个任务还没有开始执行,任务会被正常取消,未来也不会被执行,返回true
- 如果任务已经完成或已经取消,则cancel()方法会执行失败,方法返回false
- 如果这个任务已经开始,这个取消方法将不会直接取消该任务,而是会根据参数
- mayInterruptIfRunningg来做判断。如果是true,就会发出中断信号给这个任务。
4 isDone() - 判断线程是否执行完,执行完并不代表执行成功。
5 isCancelled() - 判断是否被取消
举个例子
异步执行,获取结果
public class DemoTask {
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService sv = Executors.newCachedThreadPool();
Future<String> submit = sv.submit(new CallAbleTask());
submit.get();
System.out.println("拿到结果以后继续执行");
sv.shutdown();
}
static class CallAbleTask implements Callable<String> {
@Override
public String call() throws Exception {
System.out.println("异步执行");
Thread.sleep(1000);
return "jia you";
}
}
}
获取结果,任务超时
public class DemoTask {
public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutException {
ExecutorService sv = Executors.newCachedThreadPool();
Future<String> submit = sv.submit(new CallAbleTask());
try {
submit.get(1, TimeUnit.SECONDS);
System.out.println("拿到结果以后继续执行");
} catch (Exception e) {
System.out.println("任务超时");
} finally {
sv.shutdown();
}
}
static class CallAbleTask implements Callable<String> {
@Override
public String call() throws Exception {
System.out.println("异步执行");
Thread.sleep(2000);
return "jia you";
}
}
}
FutureTask
Future是一个接口,FutureTask是一个实现类。
public class DemoTask {
public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutException {
ExecutorService sv = Executors.newCachedThreadPool();
// 这个时候不需要 返回的Future了
FutureTask<String> futureTask = new FutureTask<>(new CallAbleTask());
sv.submit(new CallAbleTask());
try {
futureTask.get(1, TimeUnit.SECONDS);
System.out.println("拿到结果以后继续执行");
} catch (Exception e) {
System.out.println("任务超时");
} finally {
sv.shutdown();
}
}
static class CallAbleTask implements Callable<String> {
@Override
public String call() throws Exception {
System.out.println("异步执行");
Thread.sleep(2000);
return "jia you";
}
}
}