`
y806839048
  • 浏览: 1121830 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

有返回的Future介绍

阅读更多

关于多线程Callable和Future
        实现多线程我们可以继承Thread类或者实现Runnable接口,通过Thread类把run()方法包装成线程执行体,但是这两种方法都不能直接把任意方法直接包装成线程执行体,比如说一个带返回值的方法,或者一个抛异常的方法。
        从Java 5开始,Java提供了Callable接口,该接口是Runnable接口的增强版,Callable接口提供了一个call()方法,可以作为线程执行体,但call()方法比run()方法的功能更强大。
call()方法可以有返回值。
call()方法可以声明抛出异常。
因此我们完全可以提供一个Callable对象作为Thread的target,而该线程的线程执行体就是Callable对象的call()方法。

       通过查阅API发现,Callable接口是java 5新增的接口,而他不是Runnable接口的子接口,所以Callable对象不能直接作为Thread类的target。而且Callable方法还有一个返回值——call()方法,不能直接调用,它是作为线程执行体才被调用的。
      

       在工具开发包中,java 5 提供了Future接口来代表Callable接口里的call()方法的返回值,并且为Future接口提供了一个FutureTask实现类,该实现类实现了Future接口,并且实现了Runnable接口——可以作为Thread类的target。实际上这里的FutureTask类实现了一个桥梁的作用,用于连接Callable对象和Thread对象。需要注意的是Callable接口有泛型限制,Callable接口里的泛型形参类型,与call()方法的返回值类型相同。

接口 Callable<V>
V call() throws Exception 计算结果,如果无法计算结果,则抛出一个异常。
类 FutureTask<V>  V - 此 FutureTask 的 get 方法所返回的结果类型。
public V get() throws InterruptedException,ExecutionException 如有必要,等待计算完成,然后获取其结果。


创建并启动有返回值的线程步骤与实现Runnable接口相似:
1.创建Callable接口的实现类,并实现call()方法
2.创建Callable实现类的实例,使用FutureTask类来包装Callable对象
3.使用FutrueTask对象作为Thread对象的target创建并启动新线程。
4.调用FutrueTask对象的get()方法来获得子线程执行结束后的返回值。
例:

[java] view plain copy
 
  1. import java.util.concurrent.Callable;  
  2. import java.util.concurrent.FutureTask;  
  3.   
  4. public class ThirdThread implements Callable<Integer>{  
  5.     public Integer call(){  
  6.         int i = 0;  
  7.         for( ; i<60; i ++){  
  8.             System.out.println(Thread.currentThread().getName() + "循环变量i的值是 : " + i);  
  9.         }  
  10.         return i;  
  11.     }  
  12.       
  13.     public static void main(String[] args) {  
  14.           
  15.         ThirdThread rt = new ThirdThread(); //创建Callable对象  
  16.         FutureTask<Integer> task = new FutureTask<Integer>(rt);//使用FutrueTask来包装Callable对象  
  17.         for(int i=0 ; i<60 ; i++){  
  18.             System.out.println(Thread.currentThread().getName() + "-------" + i);  
  19.             if(i == 10){  
  20.                 new Thread(task, "有返回值的线程").start(); //实际上还是以Callable对象创建并启动线程  
  21.             }  
  22.         }  
  23.         try{  
  24.             System.out.println("子线程的返回值 :" + task.get());  
  25.         }  
  26.         catch(Exception e){  
  27.             e.printStackTrace();  
  28.         }  
  29.     }  
  30. }  


 

总结:
         通过继承Thread类或实现Runnable、Callable接口都可以实现多线程,不过实现Runnable接口与实现Callable接口的方式基本相同,只是Callable接口里定义的方法有返回值,可以声明抛出异常而已。采用实现Runnable、Callable接口的方式创建多线程,线程类只是实现了Runnable接口或Callable接口,还可以继承其他类在这种方式下,多个线程可以共享同一个target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将 CPU、代码和数据分开,形成清晰的模型,较好的体现了面向对象的思想。

 个人理解:可以把Thread类理解成代工厂,而Runnable接口则是原材料,工厂只负责将符合标准的原材料加工成成品,而Callable接口则是另一种材料,他需要先被FutrueTask加工成半成品(即符合Runnable标准的材料),然后在交给Thread工厂加工。

分享到:
评论

相关推荐

    Android(Java)之多线程结果返回——Future 、FutureTask、Callable、Runnable

    总结一下,`Runnable`用于无返回值的简单任务,`Callable`用于有返回值的任务,`Future`作为结果的容器,而`FutureTask`则将两者结合,使得`Callable`的任务可以通过`ExecutorService`执行。在实际开发中,根据需求...

    Java使用Callable和Future创建线程操作示例

    "Java使用Callable和Future创建线程操作示例...本文主要介绍了Java使用Callable和Future创建线程操作的相关操作技巧与注意事项,为需要的朋友提供了有价值的参考。同时,本站还提供了更多Java相关内容,欢迎大家查看。

    future-0.18.2-py3-none-any.whl 官网太难下载了

    `future`库提供了`builtins`模块,使得Python 2代码可以使用Python 3的`builtins`结构,例如`open()`函数现在会返回一个类文件对象,而不是一个文件描述符。 2. `__future__`模块:在Python 2中,`__future__`模块...

    使用future处理并发1

    `concurrent.futures.as_completed()`函数接收一个`Future`列表,返回一个迭代器,当`Future`完成时产生相应的`Future`对象。 `executor.submit()`方法安排可调用对象的执行,并返回一个表示该操作的`Future`。`as_...

    future2.1.6

    创建一个`ThreadPoolExecutor`实例后,我们可以通过`submit()`方法提交任务,它会返回一个`Future`对象,通过这个对象我们可以查询任务状态、等待结果或者取消任务。 2. **ProcessPoolExecutor**:进程池执行器则是...

    Java中的Runnable,Callable,Future,FutureTask的比较

    在实际开发中,ExecutorService(如ThreadPoolExecutor)经常与Future和FutureTask一起使用,因为ExecutorService可以提交Runnable或Callable任务,并返回Future,从而实现对任务的异步处理和结果获取。例如: ```...

    C++11 future中std::promise 介绍

    7. **异步操作**: `std::promise` 常常与 `std::async` 配合使用,后者可以异步地启动一个任务,并返回一个 `std::future`,这个 `std::future` 可以用来获取任务的结果。 8. **状态检查**: `std::future` 提供了 `...

    Callable和Future.doc

    Callable 和 Future 在 Java 多线程编程中提供了更灵活的机制,特别是对于需要返回结果和处理异常的异步任务。Callable 通过 `call()` 方法返回结果和抛出异常,而 Future 则提供了管理和获取这些结果的手段。结合 ...

    比较java中Future与FutureTask之间的关系

    一、Future介绍 Future位于java.util.concurrent包下,是一个接口,定义了五个方法: 1. `cancel(boolean mayInterruptIfRunning)`: 取消任务,取消成功则返回true,取消失败则返回false。 2. `isCancelled()`: ...

    Spring Boot利用@Async异步调用:使用Future及定义超时详解

    本文将详细介绍如何使用`@Async`结合`Future`来处理异步任务,并探讨如何定义超时。 `@Async`是Spring提供的一个注解,用于标记一个方法为异步执行。当一个带有`@Async`的方法被调用时,Spring会创建一个新的线程来...

    future.zip

    1. **`Future`接口介绍** `Future`接口代表一个异步计算的结果。它提供了检查计算是否完成、获取或等待结果、取消任务等方法。这个接口并不保证结果的立即可用,而是允许用户在结果准备好之前进行其他操作,然后在...

    python中利用Future对象异步返回结果示例代码

    `Future`对象是Python标准库`asyncio`模块中的核心组件,它在异步编程中扮演着关键角色,用于表示一个尚未完成但预计在未来某个时刻会完成的操作。`Future`的主要目标是为异步操作提供一种统一的接口,使得开发者...

    Future执行具有返回值的线程.txt

    大家都知道实现多线程的2种方式,今天来讲讲Future实现具有返回值的线程。应用场景:前端调用时无需等待线程结束返回,线程结束后需进行其它操作如更新状态、通知kafuka等。

    nio+Future.rar

    例如,你可以使用NIO的Selector来监听多个客户端连接,每个连接的处理可以提交给ExecutorService,返回的Future对象可以用来获取处理结果或检查任务状态。这样,服务器可以并发地处理多个客户端请求,而不会因为等待...

    Java多线程之异步Future机制的原理和实现共5页.p

    主线程并不会阻塞,而是立即返回一个Future对象。当我们调用`future.get()`时,主线程才会被阻塞,直到任务完成并返回结果。 此外,Future机制还可以结合CompletableFuture进行更复杂的链式操作,如结果的合并、...

    图解CompletableFuture不创建线程的使用场景方法详解.docx

    面分析了 Future,通过它我们可以获取线程的执行结果,它虽然解决了 Runnable 的 “三无” 短板,但是它自身还是有短板: 不能手动完成计算 假设你使用 Future 运行子线程调用远程 API 来获取某款产品的最新价格,...

    了解JAVA Future类

    Future的主要方法包括get()方法可以当任务结束后返回一个结果,如果调用时,工作还没有结束,则会阻塞线程,直到任务执行完毕get(long timeout,TimeUnit unit)做多等待timeout的时间就会返回结果cancel(boolean...

    C++11中std::future的具体使用方法

    `std::future`的核心特性是它引用的共享状态是唯一的,不允许与其他异步返回的对象共享,这与`std::shared_future`不同。 **构造与析构** 1. **默认构造函数**:创建一个无效的`std::future`对象,不与任何共享状态...

    31 凭票取餐—Future模式详解.pdf

    1. Future模式介绍 Future模式的核心是Future接口,它提供了一种方式来获取异步计算的结果。在Java中,`java.util.concurrent.Future`接口定义了几个方法,如`get()`用于获取结果,`isDone()`检查任务是否完成,`...

Global site tag (gtag.js) - Google Analytics