zoukankan      html  css  js  c++  java
  • JAVA 笔记 Callable 与 FutureTask:有返回值的多线程

              常用的Thread类在run方法执行完之后是没有返回值的,要实现子线程完成任务后返回值给主线程需要借助第三方转存。Callable接口则提供了一种有返回值的多线程实现方法。下面以一个简单的地主、监工和长工的例子展示这种接口的用法。

    长工类:

    长工类实现了Callable接口,线程运行完成后返回一个Integer值。

    import java.util.concurrent.Callable;

    public class Changgong implements Callable<Integer>{

        private int hours=12;
        private int amount;
        
        @Override
        public Integer call() throws Exception {
            while(hours>0){
                System.out.println("I'm working......");
                amount ++;
                hours--;
                Thread.sleep(1000);
            }
            return amount;
        }
    }

     地主:主进程

    监工:FutureTask

    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.FutureTask;


    public class Dizhu {
            
        public static void main(String args[]){
            Changgong worker = new Changgong();
            FutureTask<Integer> jiangong = new FutureTask<Integer>(worker);
            new Thread(jiangong).start();
            while(!jiangong.isDone()){
                try {
                    System.out.println("看长工做完了没...");
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            int amount;
            try {
                amount = jiangong.get();
                System.out.println("工作做完了,上交了"+amount);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ExecutionException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            
        }
    }

     运行结果:

    看工人做完了没...
    I'm working......
    看工人做完了没...
    I'm working......
    看工人做完了没...
    I'm working......
    看工人做完了没...
    I'm working......
    看工人做完了没...
    I'm working......
    看工人做完了没...
    I'm working......
    看工人做完了没...
    I'm working......
    看工人做完了没...
    I'm working......
    看工人做完了没...
    I'm working......
    看工人做完了没...
    I'm working......
    看工人做完了没...
    I'm working......
    看工人做完了没...
    I'm working......
    看工人做完了没...
    工作做完了,上交了12

     从上面的例子可以看出,FutureTask 扮演了一个监工的角色,地主(主进程)通过不断地询问监工(isDone()方法)可以得知长工的工作是否完成,并且在长工完成工作后让监工收取成果(get()方法)。

  • 相关阅读:
    Navicat 回复 psc 文件 Mysql
    android SDK 更新问题完美解决 http://dl-ssl.google.com refused
    利用android来赚钱
    苹果应用 Windows 申请 普通证书 和Push 证书 Hbuilder 个推(2)
    苹果应用 Windows 申请 普通证书 和Push 证书 Hbuilder 个推
    Java version 32转64位
    浅谈Jquery中的bind()、live()、delegate()、on()绑定事件方式
    JavaScript之深浅拷贝
    关于一道JS面试题的思考
    EasyUI-Tooltip(提示框)学习
  • 原文地址:https://www.cnblogs.com/yjl49/p/2704274.html
Copyright © 2011-2022 走看看