callable多线程

本文详细对比了Callable与Runnable两个接口的不同之处,包括方法定义、执行结果处理方式等,并介绍了FutureTask类如何作为桥梁连接Callable与Runnable,使得任务既可被执行也能获取结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在网上学习后,自我整理一下对callable的理解。

(1)Callable规定的方法是call(),而Runnable规定的方法是run().
(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值的。
(3)call()方法可抛出异常,而run()方法是不能抛出异常的。
(4)运行Callable任务可拿到一个Future对象, Future表示异步计算的结果。

它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。
通过Future对象可了解任务执行情况,可取消任务的执行,还可获取任务执行的结果。
Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。

FutureTask类实现了RunnableFuture接口

public  interface  RunnableFuture<V> extends Runnable, Future<V> {
    voidrun();
}
 RunnableFuture 继承了 Runnable

可以通过FutureTask获取callable的返回结果

FutureTask中提供了一个以callable作为入参的方法

RunnableFuture继承了Runnable接口和Future接口,而FutureTask实现了RunnableFuture接口。所以它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值。
  FutureTask提供了2个构造器:

publicFutureTask(Callable<V> callable) {
}
publicFutureTask(Runnable runnable, V result) {
}
  事实上,FutureTask是Future接口的一个唯一实现类。
### 使用 Java Callable 实现多线程 在 Java 中,`Callable` 接口提供了一种更灵活的方法来创建多线程应用程序。与 `Runnable` 不同的是,`Callable` 的 `call()` 方法能够返回结果并抛异常。 为了使用 `Callable` 创建多线程程序,通常需要以下几个组件: #### 1. 定义 Callable 类 首先定义实现了 `Callable<V>` 接口的类,其中 V 是希望从任务中获得的结果类型。这个类重写了 `call()` 方法,在这里编写具体的业务逻辑代码。 ```java import java.util.concurrent.Callable; public class TaskWithResult implements Callable<String> { private String name; public TaskWithResult(String name){ this.name = name; } @Override public String call() throws Exception { return "Result of Thread " + name; } } ``` 此段代码展示了如何自定义一个带有返回值的任务[^4]。 #### 2. 提交任务给 ExecutorService 并获取 Future 对象 接着利用 `ExecutorService` 来管理线程池,并提交上述实现的对象作为数传递进去。每次调用 `submit()` 函数都会返回一个 `Future<T>` 类型对象用于接收异步计算的结果。 ```java import java.util.concurrent.*; public class Main { public static void main(String[] args) { // 初始化线程池 ExecutorService executor = Executors.newFixedThreadPool(5); try{ // 创建多个带返回值得任务实例 TaskWithResult task1 = new TaskWithResult("A"); TaskWithResult task2 = new TaskWithResult("B"); // 向线程池提交任务并得到future对象 Future<String> future1 = executor.submit(task1); Future<String> future2 = executor.submit(task2); // 获取执行结果 System.out.println(future1.get()); System.out.println(future2.get()); } catch (InterruptedException | ExecutionException e){ e.printStackTrace(); } finally { // 关闭线程池 executor.shutdown(); } } } ``` 这段代码说明了如何通过 `ExecutorService` 执行支持返回值的任务以及怎样安全地关闭资源。 以上就是在 Java 中基于 `Callable` 接口实现多线程编程的一个简单例子。值得注意的是,当涉及到大量短期任务时,应该考虑采用线程池技术以提高性能和减少开销[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值