Java多线程Callable和Future类详解

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

     public interface Future<V>      Future 表示异步计算的结果。计算完成后只能使用 get 方法来获取结果

1.线程处理返回结果

    一般开发中,使用多线程,最常见的就是:1.实现Runnable接口;2.继承Thread类。

    但是run方法是没有返回结果,很难满足我们的需求。这时,常用的办法就是实现Callable接口

    Callable接口提供了一个call方法入口,我们可以通过实现call方法,来执行任务;这个接口支持泛型,可以通过泛型参数,来获取想要的结果类型

  2.关闭线程池

    可以通过调用线程池的shutdown或shutdowNow方法来关闭线程池,但是它们的实现原理不同。

    shutdown的原理只是将线程池的状态设置SHUTDOWN状态,然后中断没有开始执行任务的线程。

    shutdownNow的原理是遍历线程池中的工作线程,然后逐个调用线程的interrupt方法来中断线程,所以需要注意一点,如果存在无法响应中断的任务,可能永远无法终止。shutdownNow会首先将线程池的状态设置成STOP,然后尝试停止所有的正在执行或暂停任务的线程,并返回等待执行任务的列表

package com.yyx.test;

import java.util.concurrent.Callable;

public class MyCallable implements Callable<String> {

    private String name;

    public MyCallable(String name) {
        this.name = name;
    }

    @Override
    public String call() throws Exception {
        return name + "任务返回的内容";
    }

}
package com.yyx.test;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class CallableFutureTest {
    public static void main(String[] args) {
        try {
            // 创建一个线程池
            ExecutorService pool=Executors.newCachedThreadPool();

            // 创建多个有返回值的任务
            List<Future> listFuture=new ArrayList<Future>();
            for(int i=1;i<=5;i++) {
                Callable c = new MyCallable("第"+i + "个线程");
                // 执行任务并获取Future对象
                Future f = pool.submit(c);
                //判断Future对象是否已经完成
                if (f.isDone()) {
                    listFuture.add(f);
                }
            }

            // 关闭线程池
            pool.shutdown(); 

            // 获取所有并发任务的运行结果
            for (Future future : listFuture) {
                // 从Future对象上获取任务的返回值,并输出到控制台
                System.out.println(">>>" + future.get().toString());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

原文地址:https://www.cnblogs.com/xianya/p/9219260.html

时间: 2024-11-05 14:59:20

Java多线程Callable和Future类详解的相关文章

Java多线程 - Callable和Future

已知的创建多线程的方法有继承Tread类和实现Runnable方法.此外Java还提供了Callable接口,Callable接口也提供了一个call()方法来做为线程执行体.但是call()方法与run()方法有些不同: call()方法可以有返回值 call()方法可以抛出异常 不过Java不允许Callable对象直接作为Thread的target.而且call()方法还有一个返回值--call()方法并不是直接调用,他是做为线程执行体被调用的.Java提供了Future接口来代表Call

Java多线程——Callable与Future

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

Java提高学习之Object类详解(1)

转自:http://www.importnew.com/10304.html 问:什么是Object类? 答:Object类存储在java.lang包中,是所有java类(Object类除外)的终极父类.当然,数组也继承了Object类.然而,接口是不继承Object类的,原因在这里指出:Section 9.6.3.4 of the Java Language Specification:“Object类不作为接口的父类”.Object类中声明了以下函数,我会在下文中作详细说明. 1 prote

java.text.Format及相关类详解

java.text.Format Format是一个用于格式化语言环境敏感的信息(如日期.消息和数字)的抽象基类,直接已知子类有DateFormat, MessageFormat, NumberFormat. Format定义了编程接口,用于将语言环境敏感的对象格式化为String(使用format方法)和将String重新解析为对象(使用 parseObject方法). 通常,一个Format的parseObject方法必须能解析任何由其Format方法格式化的字符串.不过,也可能存在不能解析

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

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

Java String类详解

Java字符串类(java.lang.String)是Java中使用最多的类,也是最为特殊的一个类,很多时候,我们对它既熟悉又陌生. 类结构: public final class String extends Object implements Serializable, Comparable<String>, CharSequence 类概述: Java程序中的所有字面值(string literals),即双引号括起的字符串,如"abc",都是作为String类的实例

StringBuffer类详解(String、StringBuffer、StringBuilder的区别)

StringBuffer类详解 1.类结构: ·        java.lang.Object ·        java.lang.StringBuffer ·        All Implemented Interfaces: Serializable, Appendable, CharSequence public final class StringBuffer extends Object implements Serializable, CharSequence 2.类概述: 一

Java多窗口卖票问题详解

Java多窗口卖票问题详解 Java 在练习Java多线程的过程中,通常都会通过多窗口卖票这个问题来详细逐渐解析多线程的线程同步,其中涉及到同步代码块,同步方法和互斥锁. 铁道部发布了一个售票任务,销售1000张票,要求有10个窗口来进行销售,请编写多线程程序来模拟这个效果. 第一步 class Test4Thread extends Thread { private static int tickets = 1000; @Override public void run() { while (

C++虚基类详解

1.虚基类的作用从上面的介绍可知:如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员.在引用这些同名的成员时,必须在派生类对象名后增加直接基类名,以避免产生二义性,使其惟一地标识一个成员,如    c1.A::display( ).在一个类中保留间接共同基类的多份同名成员,这种现象是人们不希望出现的.C++提供虚基类(virtual base class )的方法,使得在继承间接共同基类时只保留一份成员.现在,将类A声明为