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

12 篇文章 0 订阅

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值