Java多线程 - Callable和Future

已知的创建多线程的方法有继承Tread类和实现Runnable方法。此外Java还提供了Callable接口,Callable接口也提供了一个call()方法来做为线程执行体。但是call()方法与run()方法有些不同:

  • call()方法可以有返回值

  • call()方法可以抛出异常

不过Java不允许Callable对象直接作为Thread的target。而且call()方法还有一个返回值——call()方法并不是直接调用,他是做为线程执行体被调用的。Java提供了Future接口来代表Callable接口里call()方法的返回值,并为Future接口提供了一个FutureTask实现类,该实现类实现了Future接口,并实现了Runnable接口,因此可以将之作为Thread的target。

使用Callable和Future创建线程的步骤如下:

创建Callable接口的实现类,并实现call方法;

创建Callable接口实现类的实例,使用FutureTask类来包装Callable对象;

使用FutureTask对象作为Thread对象的target创建并启动新线程;

调用FutureTask对象的方法来获得子线程执行结束后的返回值。

附上实现代码:

package net.ibuluo.hunter;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

class MyThread implements Callable<String>{
    public String call() throws Exception {
        for(int i=0; i<20; i++){
            System.out.println(Thread.currentThread().getName() + " ---- " + i);
        }
        return "This is a Test!";
    }
}

public class Test {
    public static void main(String[] args) {

        MyThread mt = new MyThread();
        FutureTask<String> ft = new FutureTask<String>(mt);
        for(int i=0; i<20; i++){
            System.out.println(Thread.currentThread().getName() + " ---- " + i);
            if(i==10){
                new Thread(ft, "子线程1").start();
            }
        }

        try{
            System.out.println("子线程返回值:" + ft.get());
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
时间: 2024-12-25 15:58:45

Java多线程 - Callable和Future的相关文章

Java多线程——Callable与Future

二月份回家过年了,家里没网,所以博客也停了一段时间,上班已经一周了,总的来说还是比较忙吧!周末还是把没总结完的知识点总结一下,方便日后翻阅! Callable与Future Runnable封装一个异步运行的任务,可以把它想象成一个没有参数和返回值的异步方法.Callable与Runnable类似,但是有返回值.Callable接口是一个参数化的类型,只有一个方法call. public interface Callable<V>{ V call() throws Exception; } 类

Java多线程Callable和Future类详解

     public interface Callable<V>    返回结果并且可能抛出异常的任务.实现者定义了一个不带任何参数的叫做 call 的方法      public interface Future<V>      Future 表示异步计算的结果.计算完成后只能使用 get 方法来获取结果 1.线程处理返回结果 一般开发中,使用多线程,最常见的就是:1.实现Runnable接口:2.继承Thread类. 但是run方法是没有返回结果,很难满足我们的需求.这时,常

java多线程编程之Future/FutureTask和Callable

有这样一种场景,用多线程发送数据到某个服务器,需要知道各个线程是否都发送成功,等所有线程都发送完成才能继续下一轮计算和发送.如果用传统的多线程方式,就需要启动多个线程,然后在每个线程中分别发送数据,外部通过某种方式等待各个线程全部都发送完成,再进行后面的计算等流程.这种实现方式的代码会比较臃肿,在java中提供了一种Callable+Future的方法,可以将异步的多线程调用变为同步方式. Callable 在java的多线程编程中,有Thread和Runnable两种方式来新建线程,其中Run

java多线程Callable,Future,FutureTask

我们平时接触到的多线程Thread,Runnable,这两种方式不能返回线程执行后的结果. Callable和Future,前者产生结果,后者拿到结果. Callable和Future 推荐一篇不错的博客:http://blog.csdn.net/ghsau/article/details/7451464 public class GreyStartServlet extends HttpServlet { @Override public void init() throws ServletE

Java多线程编程中Future模式的详解&lt;转&gt;

Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Future模式,关于其他多线程设计模式的地址如下:关于其他多线程设计模式的地址如下:关于Master-Worker模式的详解: Java多线程编程中Master-Worker模式的详解关于Guarded Suspeionsion模式的详解: Java多线程编程中Guarded Suspeionsion模式

Java并发——Callable和Future

Callable和Future Executor框架将工作单元划分为任务,即任务是逻辑上的工作单元,而线程是任务异步执行的机制.Runnable是任务的一个抽象,并且理想状态下任务是独立的执行,但是Runnable的run( )不能返回一个结果或者抛出一个受检查的异常,这与我们有些实际任务是不相符的.在通过线程或者executor执行Runnable任务中,不仅仅是不能返回任务的执行结果,有时我们希望可以控制某个任务,或取消或终止,但在executor中一旦提交任务,我们将很难单一的控制任务的生

Java - 多线程Callable、Executors、Future

http://blog.csdn.net/pipisorry/article/details/44341579 Introduction Callable接口代表一段能够调用并返回结果的代码; Future接口表示异步任务.是还没有完毕的任务给出的未来结果. 所以Callable用于产生结果,Future用于获取结果. Callable接口:Java 5在concurrency包中引入了java.util.concurrent.Callable 接口.它和Runnable接口非常类似,但它能够返

Java 多线程中的Future

我们先来了解一下什么是Future Future模式是多线程开发中非常常见的一种设计模式.它的核心思想是异步调用.当我们需要执行一段复杂业务代码,可能要的时间很长,我们也许不是马上需要结果,那么这时候就可以把这个代码托管给Future让他慢慢处理, 我们继续做其他事情,等我什么时候需要用到的时候再来调这个结果. 可能有人会问那为什么不用Thread呢?很显然run方法是没有返回值的这时候就要用到Future. Future如何使用能够获取子线程运行的结果呢?在这里顺便提一下Callable接口,

Java利用Callable、Future进行并行计算求和

内容:在Java中利用Callable进行带返回结果的线程计算,利用Future表示异步计算的结果,分别计算不同范围的Long求和,类似的思想还能够借鉴到需要大量计算的地方. public class Sums { public static class Sum implements Callable<Long> { private final Long from; private final Long to; public Sum(long from, long to) { this.fro