zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    python 全栈开发,Day75(Django与Ajax,文件上传,ajax发送json数据,基于Ajax的文件上传,SweetAlert插件)
    python 全栈开发,Day73(django多表添加,基于对象的跨表查询)
    python 全栈开发,Day72(昨日作业讲解,昨日内容回顾,Django多表创建)
    bootstrap源码里的function加上了+号
    php get set方法深入理解
    20160519
    NetStatusEvent info对象的状态或错误情况的属性
    php 代码大全
    常见HTTP状态(304,200等)
    php strtotime 和 date 日期操作
  • 原文地址:https://www.cnblogs.com/daichangya/p/12959138.html
Copyright © 2011-2022 走看看