Java并行编程中的“可调用”与“可运行”任务

当我们用Java编写多线程应用程序时,我们倾向于使用“ Runnable ”接口来实现线程类。

您的类必须简单地实现此接口并覆盖run方法。

对于琐碎的用例,我们可以通过调用“ start”方法直接启动线程,结果将控制流委托给run方法。

但是,在大多数应用程序中,我们最终使用线程池,该线程池管理工作线程并在任务提交到池时促进任务执行。

Java提供了各种各样的线程池,并且还允许程序员创建自己的线程池实现。

将线程任务提交给池的过程也很标准。

在某些情况下,我们可能希望我们的线程做更多的事情,而不是仅仅执行一个任务。

在这种情况下,了解使用Runnable vs Callable的用例很重要。

1.从执行线程返回值

在许多情况下,您可能希望从执行线程返回一个值。

这是“可调用”任务派上用场的地方。

Java ExecutorService API允许接受Callable类型的任务,并返回“ Future”任务。

这对于某些用例可能很有用。

但是,下面给出了使用Callable的更重要的选择之一。

2.能够从执行线程中抛出检查异常

Callable的重要考虑因素之一是程序员具有从执行线程中引发异常的能力。

这可以从我们的多线程应用程序中处理异常,并可以从异常中正常恢复。

如果我们查看“调用”方法的签名,就会发现它引发了一个通用异常–

V call()引发异常

3.其他方案

Callable接口实现也可以与FutureTask结合使用。

FutureTask类接受Callable实现。

FutureTask可以提交给线程池执行器,我们可以使用标准的Future API检索执行结果。

下面的代码段

public class CallableInsideFutureTask

{

public static void main(String[] args)

{

ExecutorService executor = Executors.newSingleThreadExecutor();

FutureTask<String> myTask = new MyTask(new CallableTest());

executor.submit(myTask);

try {

myTask.get();

} catch (Exception ex ) {

ex.printStackTrace();

}

executor.shutdownNow();

}

}

在此示例中, CallableTest类必须实现Callable接口。

如果您喜欢这篇文章,请随时在LinkedIn上进行连接。

翻译自: https://www.javacodegeeks.com/2019/04/callable-runnable-tasks-java-concurrent-programming.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值