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

callable结合FutureTask的多线程使用(免打扰模式)的更多相关文章

  1. 超赞!IDEA 最新版本,支持免打扰和轻量模式!

    IntelliJ IDEA 2020.1 的第二个早期访问版本已发布,新的 EAP 构建对调试器和事件探查器(Profiler)进行了改进,并引入了新的提交工具窗口(Commit toolwindow ...

  2. 基于接口回调详解JUC中Callable和FutureTask实现原理

    Callable接口和FutureTask实现类,是JUC(Java Util Concurrent)包中很重要的两个技术实现,它们使获取多线程运行结果成为可能.它们底层的实现,就是基于接口回调技术. ...

  3. java Runnable、Callable、FutureTask 和线程池

    一:Runnable.Callable.FutureTask简介 (1)Runnable:其中的run()方法没有返回值. ①.Runnable对象可以直接扔给Thread创建线程实例,并且创建的线程 ...

  4. Java 并发编程——Callable+Future+FutureTask

    Java 并发编程系列文章 Java 并发基础——线程安全性 Java 并发编程——Callable+Future+FutureTask java 并发编程——Thread 源码重新学习 java并发 ...

  5. 12 Callable & Future & FutureTask

    创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果. 如果需要获取执行结果,就必须通过共享变量或者使用 ...

  6. Java多线程编程中Future模式的详解

    Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...

  7. Java多线程编程中Future模式的详解<转>

    Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...

  8. 【多线程】--生产者消费者模式--Lock版本

    在JDK1.5发布后,提供了Synchronized的更优解决方案:Lock 和 Condition 我们使用这些新知识,来改进例子:[多线程]--生产者消费者模式--Synchronized版本 改 ...

  9. java多线程-消费者和生产者模式

    /* * 多线程-消费者和生产者模式 * 在实现消费者生产者模式的时候必须要具备两个前提,一是,必须访问的是一个共享资源,二是必须要有线程锁,且锁的是同一个对象 * */ /*资源类中定义了name( ...

  10. Java多线程_生产者消费者模式2

    在我的上一条博客中,已经介绍到了多线程的经典案列——生产者消费者模式,但是在上篇中用的是传统的麻烦的非阻塞队列实现的.在这篇博客中我将介绍另一种方式就是:用阻塞队列完成生产者消费者模式,可以使用多种阻 ...

随机推荐

  1. Docker高级篇:实战Redis集群!从3主3从变为4主4从

    通过前面两篇,我们学会了三主三从的Redis集群搭建及主从容错切换迁移,随着业务增加,可能会有主从扩容的,所以,本文我们来实战主从扩容 PS本系列:<Docker学习系列>教程已经发布的内 ...

  2. css+div实现各种常见边框

    css+div实现各种常见边框 一.效果图如下 二.实现代码 div { width: 120px; height: 100px; margin: 10px; float: left; text-al ...

  3. 中国信通院高质量数字化转型产品及服务全景图发布,合合信息多项AI产品入选

    随着5G.人工智能.大数据等新一代技术的发展,企业在商业竞争中正面临更多不确定性.中国信通院高度关注企业数字化转型中遇到的痛点,发起"铸基计划-高质量数字化转型行动",链接企业数字 ...

  4. DOM – Web Components

    前言 Web Components 已经听过很多年了, 但在开发中用纯 DOM 来实现还是比较少见的. 通常我们是配搭 Angular, React, Vue, Lit 来使用. 这篇就来讲讲纯 We ...

  5. 【学习笔记】数位DP

    数位DP 适用条件 此类题目一般要求在\([l,r]\)区间内满足条件的数的个数,答案一般与数的大小无关,而与数各位的组成有关.题目中给出的数的范围一般较大,往往在\(10^9\)以上因此无法暴力枚举 ...

  6. ShiftAddAug:基于乘法算子训练的最新无乘法网络方案 | CVPR'24

    不包含乘法的运算符,如移位和加法,因其与硬件的兼容性而日益受到重视.然而,采用这些运算符的神经网络(NNs)通常表现出比具有相同结构的传统NNs更低的准确性.ShiftAddAug利用成本较高的乘法来 ...

  7. 暑假集训CSP提高模拟8

    一看见题目列表就吓晕了,还好我是体育生,后面忘了 唉这场比赛没啥好写的,要不就是太难要不就是太简单要不就是拉出去写在专题里了 A. 基础的生成函数练习题 考虑到只有奇偶性相同才能尝试加二,因此先用加一 ...

  8. 立足信创国产化运维,打造安全可控IT运维管理系统

    随着国产化信创应用试点行业的不断扩大,应用信创产品的企事业单位逐渐增多.大多数企业均面临着陌生的国产化环境与产品,其使用习惯和解决问题的方式都面临改变.北京智和信通切实立足用户需求,提供信创运维服务. ...

  9. DDD实体和对象

    实体 entity 标识符用来唯一定位一个对象,在数据库中我们一般用表的主键来实现标识符,主键和标识符的思考角度不同,就是 id 字段 : 实体:拥有唯一的标识符,标识符的值不会改变,而其他对象的状态 ...

  10. 何为ORM框架?和ADO.NET 对比

    百度:ORM(Object Relational Mapping)框架采用元数据来描述对象与关系映射的细节,元数据一般采用XML格式,并且存放在专门的对象一映射文件中.简单理解为一种框架的格式 . 只 ...