Callable
java5引入java.util.concurrent包,其中包含了locks包、atomic包、线程池(Executors)、阻塞队列(BlockingQueue)、Callable、Future等相关多线程解决方案。
Callable的出现解决Runable没有返回值,无法抛出异常的问题。同时先线程池Executors 提供了许多方法,可以操控 Callable 在线程池中运行。
Future
Executors 执行 Callable 时会返回一个 Future 对象。使用 Future 我们可以得知 Callable 的运行状态,以及获取 Callable 执行完后的返回值。
Future<?> submit(Runnable task);
Future submit(Callable task);
Future 的方法介绍:
- get() :阻塞式,用于获取 Callable 执行完后的返回值,runable返回null
- V get(long timeout, TimeUnit unit)throws InterruptedException,ExecutionException, TimeoutException :指定时间线程没有执行完抛出异常TimeoutException
- boolean cancel(boolean mayInterruptIfRunning) : 撤销正在执行 Callable 的 Task。参数true终止现在正在运行的线程,如果线程在sleep会抛出InterruptedException异常
- isDone():是否执行完毕。
- isCancelled():任务是否已经被取消。
Future cancel(true)与interrupt()的区别
- 使用future调用cancel(true),线程会停止任务。除非线程是Runable且正处于阻塞状态会抛出异常,不会结束进程。
- 当对一个线程,调用 interrupt() 时,① 如果线程处于被阻塞状态(例如处于sleep, wait, join 等状态),那么线程将立即退出被阻塞状态,并抛出一个InterruptedException异常。仅此而已。② 如果线程处于正常活动状态,那么会将该线程的中断标志设置为 true,仅此而已。被设置中断标志的线程将继续正常运行,不受影响。