共计 1278 个字符,预计需要花费 4 分钟才能阅读完成。
在 Java 中,创建线程一般有两种方式,一种是继承 Thread 类,一种是实现 Runnable 接口。然而,这两种方式的缺点是在线程任务执行结束后,无法获取执行结果。我们一般只能采用共享变量或共享存储区以及线程通信的方式实现获得任务结果的目的。不过,Java 中,也提供了使用 Callable 和 Future 来实现获取任务结果的操作。Callable 用来执行任务,产生结果,而 Future 用来获得结果。
Future 常用方法:
V get():获取异步执行的结果,如果没有结果可用,此方法会阻塞直到异步计算完成。
V get(Long timeout , TimeUnit unit):获取异步执行结果,如果没有结果可用,此方法会阻塞,但是会有时间限制,如果阻塞时间超过设定的 timeout 时间,该方法将抛出异常。
boolean isDone():如果任务执行结束,无论是正常结束或是中途取消还是发生异常,都返回 true。
boolean isCanceller():如果任务完成前被取消,则返回 true。
boolean cancel(boolean mayInterruptRunning):如果任务还没开始,执行 cancel(…)方法将返回 false;如果任务已经启动,执行 cancel(true)方法将以中断执行此任务线程的方式来试图停止任务,如果停止成功,返回 true;当任务已经启动,执行 cancel(false)方法将不会对正在执行的任务线程产生影响 (让线程正常执行到完成),此时返回 false;当任务已经完成,执行 cancel(…) 方法将返回 false。mayInterruptRunning 参数表示是否中断执行中的线程。
通过方法分析我们也知道实际上 Future 提供了 3 种功能:(1)能够中断执行中的任务(2)判断任务是否执行完成(3)获取任务执行完成后额结果。
- 定义 thread
public class CallThread implements Callable<String> {
@Override
public String call() throws InterruptedException {Thread.sleep(1000);
return "callable and future";
}
}
- 测试
@RequestMapping("test-call")
public void testCall() {CallThread callThread = new CallThread();
ExecutorService executor = Executors.newCachedThreadPool();
Future<String> submit = executor.submit(callThread);
try {String s = submit.get();
System.out.println("获取结果:" + s);
} catch (InterruptedException e) {e.printStackTrace();
} catch (ExecutionException e) {e.printStackTrace();
}
}