java多线程总结笔记3——Callable和Future

来源:互联网 发布:日式豚骨叉烧拉面 淘宝 编辑:程序博客网 时间:2024/05/17 02:44

Runnable和Callable

Runnable和Callable<T>都是任务类型。Runnable类只有一个成员void run(),而Callable<T>类只有一个成员T call() throws Exception,这两个函数都应该在子类中被重写为任务流程。线程在start的时候,会自动调用它们,从而执行这套流程。

可见,Runnable任务的流程函数不能有返回值,也不准向父函数抛出异常;而Callable任务的流程函数有返回值,也可以向父函数抛出异常。

利用Callable任务也可以创建进程,但是要先用FutureTask<T>类的构造函数FutureTask<T>(Callable<T> target)把它包装为FutureTask任务,由于FutureTask<T>类同时继承了Runnable和Future<T>两个接口,所以也是Runnable的一种,因此可以用来创建线程。具体做法如下,方括号表示可选项目。

public class MyCallable implements Callable<某种类型>{    public 某种类型 call()[ throws 一些异常类型]    {任务流程}}MyCallable myCallable = new MyCallable();FutureTask<某种类型> futureTask = new FutureTask<某种类型>(myCallable);Thread myThread = new Thread(futureTask);myThread.start();


Future<T>接口

Future<T>也是任务类型,这种任务可以取消执行,也可以等待其执行完毕然后获取执行结果,执行结果的类型为T。

boolean cancel(boolean mayInterruptRunning):尝试取消任务的执行。如果任务尚未启动,则任务将不会运行;如果任务已经启动而尚未结束,则mayInterruptRunning决定了是否要尝试停止任务。如果任务已经完成、已经取消或因为某些其他原因而无法取消,则函数返回false。

boolean isCancelled():如果任务已被成功取消,则返回true.

boolean isDone():如果任务已经结束,不管是正常终止、出现异常还是被取消,都会反对true.

T get():等待任务结束,然后返回任务执行结果。

T get(long timeout, TimeUnit unit):等待任务结束,但是最多等待timeout,然后返回任务执行结果。


FutureTask<T>类(实现类)

FutureTask<T>类同时继承了Runnable和Future<T>两个接口,所以它既有明确的任务流程,又有Future任务可取消、可取得执行结果的特点,执行结果的类型为T。

不仅Callable任务可以包装成FutureTask任务,Runnable任务也可以。

FutureTask<T>(Callable<T> callable):将callable包装为FutureTask任务,callable的返回值就是FutureTask任务成功完成时返回的执行结果。

FutureTask<T>(Runnable runnable, T result):将runnable包装为FutureTask任务,result就是FutureTask任务成功完成时返回的执行结果。


ExecutorService类有关Callable的函数

Future<T> submit(Callable<T> target):向线程池提交target任务,返回包装成的FutureTask任务。

Future<T> submit(Runnable target, T result):向线程池提交target任务,任务成功完成时返回的执行结果为result,返回包装成的FutureTask任务。

Future<?> submit(Runnable target):相当于submit(target, null).

List<Future<T>> invokeAll(Collection<Callable<T>> tasks):批量提交任务,当所有任务都完成时,返回包装成的FutureTask任务们组成的列表。

List<Future<T>> invokeAll(Collection<Callable<T>> tasks, long timeout, TimeUnit unit):同上。如果到了时限时还有任务没结束,那就cancel掉所有未结束的任务,然后返回FutureTask任务列表。

T invokeAny(Collection<Callable<T>> tasks):批量提交任务,一旦有一个任务成功完成,就返回其执行结果。函数一旦正常或异常返回,就cancel掉所有未完成的任务。

T invokeAny(Collection<Callable<T>> tasks, long timeout, TimeUnit unit):同上。





0 0
原创粉丝点击