`

callable结合FutureTask的多线程使用(免打扰模式)

 
阅读更多
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * 
 * @author Kaiwii Ho
 * Callable类就是一个有返回值的任务
 * 对于任务与Thread之间的关系,可以这样子理解:
 * Callable类的实例就是一个锦囊妙计;而Thread就是执行这个锦囊妙计的过程
 * 
 * FutureTask类(Future接口的一个实现)就是一个监视器:检测着被若干个异步线程操作的变量的一个类
 * 
 * 代码演示了主线程如何通过使用Callable类和FutureTask类,实现:
 * 主线程一边等待子线程的处理结果,一边完成自己的工作。
 *
 *考虑以下一个小黑工kaiwii的故事……
 */
public class TestFutureTask {
    


    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //准备一份工作给一个打工仔employee叫Kaiwii
        Employee kaiwii=new Employee("kaiwii");
        //新建一个监工头inspector
        FutureTask<Double>inspector=new FutureTask<Double>(kaiwii);
        //让kaiwii这个打工仔工作
        System.out.println("老板发话,让kaiwii这个打工仔工作吧!");
        new Thread(inspector).start();
        System.out.println("老板开始数钱!");
        //老板一边数钱,一边命令监工inspector监视Kaiwii工作;一旦kaiwii完成工作就拿来让他检查
        while(!inspector.isDone()){
            System.out.println("老板数钱中……");
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
        //老板交监工inspector将kaiwii的结果呈上来以便他验收kaiwii计算出来的结果
        try {
            System.out.println("老板发现kaiwii的结果是:"+inspector.get());
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

//子线程
class Employee implements Callable<Double>{
    String employee_name;
    
    private void setEmployee_name(String employee_name) {
        this.employee_name = employee_name;
    }
    
    public Employee(String employee_name) {
        setEmployee_name(employee_name);
    }
    @Override
    public Double call() throws Exception {
        // TODO Auto-generated method stub
        System.out.println("工人"+employee_name+"说:我开始工作了!!!!");
        for(int i=1;i<=10;i++){
            System.out.println("工人"+employee_name+" 第"+i+"次说:我在工作呢!!!!");
            Thread.sleep(1000);
        }
        System.out.println("工人"+employee_name+"说:我搞好了!!!!");
        return Math.random();
    }
}

console显示结果:

老板发话,让kaiwii这个打工仔工作吧!
老板开始数钱!
工人kaiwii说:我开始工作了!!!!
工人kaiwii 第1次说:我在工作呢!!!!
老板数钱中……
老板数钱中……
工人kaiwii 第2次说:我在工作呢!!!!
老板数钱中……
老板数钱中……
老板数钱中……
工人kaiwii 第3次说:我在工作呢!!!!
老板数钱中……
老板数钱中……
工人kaiwii 第4次说:我在工作呢!!!!
老板数钱中……
老板数钱中……
工人kaiwii 第5次说:我在工作呢!!!!
老板数钱中……
老板数钱中……
工人kaiwii 第6次说:我在工作呢!!!!
老板数钱中……
老板数钱中……
工人kaiwii 第7次说:我在工作呢!!!!
老板数钱中……
老板数钱中……
工人kaiwii 第8次说:我在工作呢!!!!
老板数钱中……
老板数钱中……
工人kaiwii 第9次说:我在工作呢!!!!
老板数钱中……
老板数钱中……
工人kaiwii 第10次说:我在工作呢!!!!
老板数钱中……
工人kaiwii说:我搞好了!!!!
老板数钱中……
老板发现kaiwii的结果是:0.5295364482450889
分享到:
评论

相关推荐

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

    Java使用Callable和Future创建线程操作示例主要介绍了Java使用Callable和Future创建线程操作,结合实例形式分析了java使用Callable接口和Future类创建线程的相关操作技巧与注意事项。 首先,Java 5开始,Java提供了...

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

    `ExecutorService`可以接收`Runnable`或`Callable`任务,因此`FutureTask`在Android多线程中也很常见。 总结一下,`Runnable`用于无返回值的简单任务,`Callable`用于有返回值的任务,`Future`作为结果的容器,而`...

    futuretask用法及使用场景介绍

    FutureTask可以与ExecutorService结合使用,实现多任务计算。在这种场景下,主线程可以继续执行其他任务,而不需要等待计算结果。例如,在一个科学计算应用中,需要对大量数据进行计算,可以使用FutureTask和...

    java多线程返回值使用示例(callable与futuretask)

    为了解决这个问题,Java提供了`Callable`接口和`FutureTask`类,它们是实现多线程返回值的关键工具。 `Callable`接口类似于`Runnable`,但比它功能更强大。`Callable`接口中的`call()`方法可以返回一个结果,并且...

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

    Java中的Runnable、Callable、Future和FutureTask是Java多线程编程中的核心概念,它们各自扮演着不同的角色,共同协作以实现并发任务的管理和执行。 1. **Runnable**: Runnable是最基本的多线程接口,它只有一个`...

    java callable(多线程)

    ### Java Callable与多线程详解 在Java编程中,`Callable`接口是处理多线程问题的一个重要概念,尤其在需要从线程中返回结果的情况下。`Callable`接口与我们熟知的`Runnable`接口相似,但功能更加强大,主要体现在...

    【Java】Callable创建线程用到的适配器模式(csdn)————程序.pdf

    本文将详细解释Callable接口的使用、适配器模式在创建线程中的应用,以及FutureTask在其中的角色。 首先,Callable接口与Runnable接口类似,都是用于创建新线程的接口。但是,Runnable接口的run()方法无返回值,而...

    多线程单例模式并发访问

    3. **实现Callable接口**:自Java 1.5开始,可以使用`Callable`接口结合`FutureTask`来创建有返回值的线程。 #### 四、启动线程 启动线程时,应当使用`Thread`对象的`start()`方法,而不是直接调用`run()`方法。这...

    Java多线程设计模式_清晰完整PDF版 Java多线程设计模式源代码

    Java提供多种创建线程的方式,如继承Thread类、实现Runnable接口以及使用ExecutorService和Callable接口。每种方式有其适用场景和优缺点,例如,实现Runnable接口比继承Thread更灵活,因为可以避免类的单继承限制。 ...

    详解Java Callable接口实现多线程的方式

    Callable接口和Future接口的组合使用,能够实现多线程并发执行任务,并获取执行结果。 一、Callable接口简介 Callable接口是一个泛型接口,用于表示可以调用并返回结果的代码。它提供了一个call()方法,该方法...

    JAVA中Callable的使用

    如果你需要从多个Callable任务中获取结果,可以使用`FutureTask`。`FutureTask`是`Future`的一个具体实现,它同时也是一个`Runnable`,可以直接提交给ExecutorService。`FutureTask`的构造函数接受一个Callable对象...

    spring线程池ThreadPoolExecutor配置以及FutureTask的使用

    在Java的多线程编程中,Spring框架提供了一种便捷的方式来管理和配置线程池,这就是`ThreadPoolTaskExecutor`。这个类是Spring对Java内置的`java.util.concurrent.ThreadPoolExecutor`的封装,允许开发者在Spring...

    Java多线程设计模式源代码

    Java多线程设计模式是Java编程中至关重要的一个领域,它涉及到如何在并发环境中高效、稳定地执行多个任务。在Java中,多线程可以提高应用程序的响应速度和整体性能,尤其是在处理I/O密集型或计算密集型任务时。本...

    【并发编程】 — Runnable、Callable、Future和FutureTask之间的关系

    2 如何使用FutureTask 、Future、Callable、线程池实现线程2.1 FutureTask + Callable实现多线程2.2 线程池+Future+Callable 实现多线程3 Runnable、Callable、Future和FutureTask之间的关系3.1 整体关系介绍3.2 ...

    多线程发邮件

    在多线程环境中,我们可以通过`FutureTask`将Callable转换为Runnable,这样就可以在ExecutorService中执行。`FutureTask`不仅可以代表一个Callable的结果,还可以用于取消任务或者检查任务是否完成。 提到...

    Java多线程下的其他组件之CyclicBarrier、Callable、Future和FutureTask详解

    在Java多线程编程中,CyclicBarrier、Callable、Future和FutureTask是四个重要的组件,它们各自提供了不同的功能,帮助开发者更好地管理和协调并发任务。接下来,我们将深入探讨这些组件的特性和使用方法。 首先,...

    FutureTask底层实现分析,有了FutureTask主线程要想获得工作线程(异步计算线程)的结果变得比较简单

    FutureTask 是 Java 中的一种非常重要的多线程设计模式,用于异步计算线程之间的结果传递。在 JDK 中,FutureTask 类是 Future 模式的实现,它实现了 Runnable 接口,作为单独的线程运行。在其 run() 方法中,通过 ...

    Callable, Future, FutureTask2

    通过合规策略对服务器进行监控,确保服务器的运行、帐号在服务器上的操作符合预设的规则。日志:收集、整理服务器的日志信息,提供给管理员查看,并作为异常判断、故障排查的依据。进程:监控服务器上的进程,并对...

    Runnable、Callable、Future、FutureTask有什么关联.docx

    Runnable、Callable、Future、FutureTask有什么关联.docx

Global site tag (gtag.js) - Google Analytics