Java并发编程-Executor框架之Callable和Future接口

在上一篇文章中我们已经了解了Executor框架进行线程管理,这篇文章将学习Executor框架的另一个特性,我们知道执行Runnable任务是没有返回值得,但Executor可以运行并发任务并获得返回值,Concurrent包提供下面两个接口实现这个功能:

  • Callable接口:这个接口声明call(),类似于Runnable的run(),可以在这个方法里实现任务的具体逻辑操作。Callable是一个泛型接口,必须声明call()的返回类型。
  • Future接口:这个接口声明了一下方法来获取Callable的返回数据。

使用方法

通过Executor的submit()提交Callable任务执行,这个Submit()方法将会返回Future对象。利用Future对象可以:

  • 使用isDone()方法,查看任务是否完成。
  • 通过get()方法获call()方法执行的返回值,这个方法会一直等待callable对象执行完call()方法并返回结果。如果出现中断,get()方法会抛出InterruptedException,或者call()方法抛出的异常。
package MyThread;

import java.util.ArrayList;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor;

public class ExecutorTest {
    public static void main(String[] args){
        ThreadPoolExecutor executor = (ThreadPoolExecutor)Executors.newCachedThreadPool();
        ArrayList<Future<String>> list=new ArrayList<>();
        for (int i = 0; i < 5; i++){
            Future<String> result=executor.submit(new task());
            list.add(result);
        }
        for(Future<String> f:list){
            try {
                //while(!f.isDone()){};
                System.out.println(f.get());
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ExecutionException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        executor.shutdown();

    }

}
class task implements Callable<String>{
    @Override
    public String call() throws Exception {
        // TODO Auto-generated method stub
        Random random=new Random();
        int result=random.nextInt(100);
          // 第二阶段——等待所有选手准备好
        Thread.sleep((long) (random.nextInt(5) * 1000));
        return Thread.currentThread().getName()+":"+result;
    }

}

结果:

pool-1-thread-1:84

pool-1-thread-2:78

pool-1-thread-3:15

pool-1-thread-4:99

pool-1-thread-5:2

运行多个任务并处理所以结果:

ThreadPoolExecutor通过一个 invokeAll()方法,支持将多个Callable任务放进集合当中,并等待所有任务完成,再把结果返回到Future的链表当中。

与submit()不同,invokeAll()会阻塞直到所以得任务都执行完成。

例如:

package MyThread;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor;

public class ExecutorTest {
    public static void main(String[] args){
        ThreadPoolExecutor executor = (ThreadPoolExecutor)Executors.newCachedThreadPool();

        //任务链表
        List<task> tasklist=new ArrayList<>();
        //结果链表
        List<Future<String>> resultlist=new ArrayList<>();
        for (int i = 0; i < 5; i++){
            tasklist.add(new task());
        }
        try {
            resultlist=executor.invokeAll(tasklist);
        } catch (InterruptedException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } 

        System.out.println("获取执行结果:");
        for(Future<String> f:resultlist){
            try {
//              while(!f.isDone()){};
                System.out.println(f.get());
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ExecutionException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        executor.shutdown();

    }

}
class task implements Callable<String>{
    @Override
    public String call() throws Exception {
        // TODO Auto-generated method stub
        Random random=new Random();
        int result=random.nextInt(100);
          // 第二阶段——等待所有选手准备好
        Thread.sleep((long) (random.nextInt(5) * 1000));
        return Thread.currentThread().getName()+":"+result;
    }

}
时间: 2024-10-23 17:44:09

Java并发编程-Executor框架之Callable和Future接口的相关文章

Java并发编程-Executor框架(转)

本文转自http://blog.csdn.net/chenchaofuck1/article/details/51606224 感谢作者 我们在传统多线程编程创建线程时,常常是创建一些Runnable对象,然后创建对应的Thread对象执行它们,但是如果程序需要并发执行大量的任务时,需要为每个任务都创建一个Thread,进行管理,这将会影响程序的执行效率,并且创建线程过多将会使系统负载过重. 在JDK 1.5之后通过了一套Executor框架能够解决这些问题,能够分解任务的创建和执行过程.该框架

java并发编程-Executor框架

一 简介 线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的.在jdk1.5之后这一情况有了很大的改观.Jdk1.5之后加入了java.util.concurrent包,这个包中主要介绍java中线程以及线程池的使用.为我们在开发中处理线程的问题提供了非常大的帮助. 二:线程池 线程池的作用: 线程池作用就是限制系统中执行线程的数量.     根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果:少了浪费了系统资源,多了造成

Java并发编程-Executor框架集

Executor框架集对线程调度进行了封装,将任务提交和任务执行解耦. 它提供了线程生命周期调度的所有方法,大大简化了线程调度和同步的门槛. Executor框架集的核心类图如下: 从上往下,可以很清晰的看出框架集的各个类,以及它们之间的关系:Executor,是一个可以提交可执行(Runnable)任务的Object,这个接口解耦了任务提交和执行细节(线程使用.调度等),Executor主要用来替代显示的创建和运行线程:ExecutorService提供了异步的管理一个或多个线程终止.执行过程

Java并发编程 - Executor框架(一)Executor,

1.并发编程的一种编程方式是把任务拆分为一些列的小任务,即Runnable,然后将这些任务提交给一个Executor执行, Executor.execute(Runnalbe) .Executor在执行时使用其内部的线程池来完成操作. Executor的子接口有:ExecutorService,ScheduledExecutorService,已知实现类:AbstractExecutorService,ScheduledThreadPoolExecutor,ThreadPoolExecutor.

Java并发编程与技术内幕:Callable、Future、FutureTask、CompletionService

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 在上一文章中,笔者介绍了线程池及其内部的原理.今天主要讲的也是和线程相关的内容.一般情况下,使用Runnable接口.Thread实现的线程我们都是无法返回结果的.但是如果对一些场合需要线程返回的结果.就要使用用Callable.Future.FutureTask.CompletionService这几个类.Callable只能在ExecutorService的线程池中跑,但有返回结果,也可

【Java 并发】Executor框架机制与线程池配置使用

[Java 并发]Executor框架机制与线程池配置使用 一,Executor框架Executor框架便是Java 5中引入的,其内部使用了线程池机制,在java.util.cocurrent 包下,通过该框架来控制线程的启动.执行和关闭,可以简化并发编程的操作.因此,在Java 5之后,通过Executor来启动线程比使用Thread的start方法更好,更易管理,效率更好(用线程池实现,节约开销). Executor框架主要包括:Executor,Executors,ExecutorSer

Java并发编程——Executor接口及线程池的使用

在如今的程序里,单线程的程序,应该已经比较少了,而Java语言是内置支持多线程并发的,大家都说Java语言内置支持多线程,非常非常的强大和方便,但一直没有深入研究jdk内concurrent包.今天就认真学习了一下java.util.concurrent包,发现jdk多线程编程果然是强大和方便.本文是学习java.util.concurrent包内线程池及相关接口的一些总结. 任务接口抽象 Runnable接口 在java.lang包内,为多线程提供了Runnable接口. public int

Java并发编程 - Executor,Executors,ExecutorService, CompletionServie,Future,Callable

一.Exectuor框架简介 Java从1.5版本开始,为简化多线程并发编程,引入全新的并发编程包:java.util.concurrent及其并发编程框架(Executor框架). Executor框架是指java 5中引入的一系列并发库中与executor相关的一些功能类,其中包括线程池,Executor,Executors,ExecutorService,CompletionService,Future,Callable等.他们的关系为 在Executor框架中,使用执行器(Exectuo

Java 并发编程 Executor

Executor框架是指java 5中引入的一系列并发库中与executor相关的一些功能类,其中包括线程池,Executor,Executors,ExecutorService,CompletionService,Future,Callable等.他们的关系为: 并发编程的一种编程方式是把任务拆分为一些列的小任务,即Runnable,然后在提交给一个Executor执行,Executor.execute(Runnalbe) .Executor在执行时使用内部的线程池完成操作. 一.创建线程池