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

  • 相关阅读:
    bzoj4758: [Usaco2017 Jan]Subsequence Reversal(区间dp)
    bzoj4580: [Usaco2016 Open]248(区间dp)
    1617: [Usaco2008 Mar]River Crossing渡河问题(dp)
    bzoj21012101: [Usaco2010 Dec]Treasure Chest 藏宝箱(滚动数组优化dp)
    P2339 提交作业usaco(区间dp)
    day11
    bzoj2330: [SCOI2011]糖果(差分约束)
    P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm(Tarjan+记忆化)
    P2700逐个击破(并查集/树形dp)
    bzoj1770: [Usaco2009 Nov]lights 燈(折半搜索)
  • 原文地址:https://www.cnblogs.com/daichangya/p/12959138.html
Copyright © 2011-2022 走看看