10、java5线程池之返回结果的任务之Callable与Future

JDK文档描述Callable:

public interface Callable<V>返回结果并且可能抛出异常的任务。实现者定义了一个不带任何参数的叫做 call 的方法。 

Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的。但是 Runnable 不会返回结果,并且无法抛出经过检查的异常。 

Executors 类包含一些从其他普通形式转换成 Callable 类的实用方法

唯一的一个方法是:

call
V call()
       throws Exception计算结果,如果无法计算结果,则抛出一个异常。 

返回:
计算的结果
抛出:
Exception - 如果无法计算结果

JDK文档描述Future:

public interface Future<V>Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。计算完成后只能使用 get 方法来获取结果,如有必要,计算完成前可以阻塞此方法。取消则由 cancel 方法来执行。还提供了其他方法,以确定任务是正常完成还是被取消了。一旦计算完成,就不能再取消计算。如果为了可取消性而使用 Future 但又不提供可用的结果,则可以声明 Future<?> 形式类型、并返回 null 作为底层任务的结果。

主要的方法有:

 方法摘要
 boolean  cancel(boolean mayInterruptIfRunning)
          试图取消对此任务的执行
 V  get()
          如有必要,等待计算完成,然后获取其结果。
 V  get(long timeout, TimeUnit unit)
          如有必要,最多等待为使计算完成所给定的时间之后,获取其结果(如果结果可用)。
 boolean  isCancelled()
          如果在任务正常完成前将其取消,则返回 true
 boolean  isDone()
          如果任务已完成,则返回 true

例子:

import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.CompletionService;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class ThreadPool2 {
    public static void main(String[] args) {
        test1();
    }

    private static void test1(){
        ExecutorService es = Executors.newFixedThreadPool(2);

        for(int i=1 ; i<=5; i++){
            final int task = i;
            Future<Integer> future = es.submit(new Callable<Integer>() {
                @Override
                public Integer call() throws Exception {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("Callable 任务【" + task + "】运行");
                    return new Random().nextInt(100);
                }
            });

            System.out.println("当前提交第【" + i + "】返回结果的任务");

            try {
                System.out.println("任务【" + i + "】返回的结果:" + future.get());
            } catch (Exception  e) {
                e.printStackTrace();
            }
        }
        System.out.println("我是for循环后面的代码----------");
        es.shutdown();
    }
}

运行结果:

当前提交第【1】返回结果的任务
Callable 任务【1】运行
任务【1】返回的结果:49
当前提交第【2】返回结果的任务
Callable 任务【2】运行
任务【2】返回的结果:92
当前提交第【3】返回结果的任务
Callable 任务【3】运行
任务【3】返回的结果:17
当前提交第【4】返回结果的任务
Callable 任务【4】运行
任务【4】返回的结果:96
当前提交第【5】返回结果的任务
Callable 任务【5】运行
任务【5】返回的结果:14
我是for循环后面的代码----------
时间: 2024-10-18 01:07:00

10、java5线程池之返回结果的任务之Callable与Future的相关文章

6、java5线程池之固定大小线程池newFixedThreadPool

1 package com.yzl; 2 3 import java.util.Random; 4 import java.util.concurrent.Callable; 5 import java.util.concurrent.ExecutorService; 6 import java.util.concurrent.Executors; 7 import java.util.concurrent.Future; 8 import java.util.concurrent.TimeUn

java5线程池详解与Executors类创建不同线程池的用法

java中的线程池是非常重要的,它可以节省资源开销,从而提升程序的性能.向Tomcat等一些web服务器都必须用到线程池.java5中为我们提供了一些应用线程池的API,下面的代码将详解其用法. package hxl.insist; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorSer

8、java5线程池之动态缓存线程池newCachedThreadPool

JDK文档描述 创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们.对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能.调用 execute 将重用以前构造的线程(如果线程可用).如果现有线程没有可用的,则创建一个新线程并添加到池中.终止并从缓存中移除那些已有 60 秒钟未被使用的线程.因此,长时间保持空闲的线程池不会使用任何资源.注意,可以使用 ThreadPoolExecutor 构造方法创建具有类似属性但细节不同(例如超时参数)的线程池.

Java并发编程之线程创建和启动(Thread、Runnable、Callable和Future)

这一系列的文章暂不涉及Java多线程开发中的底层原理以及JMM.JVM部分的解析(将另文总结),主要关注实际编码中Java并发编程的核心知识点和应知应会部分. 说在前面,Java并发编程的实质,是线程对象调用start方法启动多线程,而线程对象则必须是Thread类或其子类实现.Runnable和Callable的作用类似于Comparable.Serializable,是用于被并发的类实现的接口,从而使得Thread类可以在初始化时传入这个被并发的类.此是大前提.本文从多线程实现和启动出发,对

11、java5线程池之异步任务CompletionService

JDK文档描述: public interface CompletionService<V> 将生产新的异步任务与使用已完成任务的结果分离开来的服务.生产者 submit 执行的任务.使用者 take 已完成的任务,并按照完成这些任务的顺序处理它们的结果.例如,CompletionService 可以用来管理异步 IO ,执行读操作的任务作为程序或系统的一部分提交,然后,当完成读操作时,会在程序的不同部分执行其他操作,执行操作的顺序可能与所请求的顺序不同. 通常,CompletionServi

java多线程(三)-Executors实现的几种线程池以及Callable

从java5开始,类库中引入了很多新的管理调度线程的API,最常用的就是Executor(执行器)框架.Executor帮助程序员管理Thread对象,简化了并发编程,它其实就是在 提供了一个中间层,方便程序员管理异步任务的执行,而又不用显式的管理线程的生命周期. Executor采用了线程池实现,也更节约开销,因为是我们启动新线程的首选方法. 示例代码:src/thread_runnable/CachedThreadPool.java 1 public class CachedThreadPo

java核心知识点 --- 线程池ThreadPool

线程池是多线程学习中需要重点掌握的. 系统启动一个新线程的成本是比较高的,因为它涉及与操作系统交互.在这种情形下,使用线程池可以很好的提高性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池. 一.如何创建线程池?? 在Java5之前,线程池都是开发才手动实现的,从Java5开始,Java内建支持线程池.主要是新增了一个executors工厂类来生产线程池. 1.newCachedThreadPool():创建一个具有缓存功能的线程池,系统根据需要创建线程,这些线程将会被缓

Java多线程学习(八)线程池与Executor 框架

Java面试通关手册(Java学习指南,欢迎Star,会一直完善下去,欢迎建议和指导):https://github.com/Snailclimb/Java_Guide 历史优质文章推荐: Java并发编程指南专栏 分布式系统的经典基础理论 可能是最漂亮的Spring事务管理详解 面试中关于Java虚拟机(jvm)的问题看这篇就够了 目录: [TOC] 本节思维导图: 思维导图源文件+思维导图软件关注微信公众号:"Java面试通关手册" 回复关键字:"Java多线程"

Java线程池学习总结

一 使用线程池的好处 池化技术相比大家已经屡见不鲜了,线程池.数据库连接池.Http 连接池等等都是对这个思想的应用.池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率. 线程池提供了一种限制和管理资源(包括执行一个任务). 每个线程池还维护一些基本统计信息,例如已完成任务的数量. 这里借用<Java 并发编程的艺术>提到的来说一下使用线程池的好处: 降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 提高响应速度.当任务到达时,任务可以不需要的等到线程创建就