本文主要是介绍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;@Overridepublic 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 blocke.printStackTrace();}}int amount;try {amount = jiangong.get();System.out.println("工作做完了,上交了"+amount);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ExecutionException e) {// TODO Auto-generated catch blocke.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()方法)。
转载自:http://www.cnblogs.com/yjl49/archive/2012/09/26/2704274.html
这篇关于JAVA 笔记 Callable 与 FutureTask:有返回值的多线程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!