Callable 和 FutureTask 生产者和消费者
来源:互联网 发布:hemingway软件 编辑:程序博客网 时间:2024/06/01 07:35
常用的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;
}
}
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();
}
}
}
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
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
0 0
- Callable 和 FutureTask 生产者和消费者
- Callable、Future和FutureTask
- Callable、Future和FutureTask
- Callable和Future、FutureTask
- Callable、Future和FutureTask
- Callable、Future和FutureTask
- Callable、Future和FutureTask
- Callable、Future和FutureTask
- Callable 和 FutureTask
- Callable、Future和FutureTask
- Callable、Future和FutureTask
- Callable和Future和FutureTask
- Callable, Future和FutureTask简述
- Callable、Future和FutureTask区别
- Callable、Future和FutureTask使用说明
- Runnable、Callable、Future 和 FutureTask
- Java多线程之 Callable、Future和FutureTask
- java中callable和futuretask使用
- 从java网络编程学起(2)
- CSS层叠样式表
- 分页技术COUNT STOPKEY和SORT ORDER BY
- instanceof
- Runtime.exec() 的陷阱
- Callable 和 FutureTask 生产者和消费者
- 【Wikioi】1065-01字符串
- Hibernate4学习(2)基于注解配置
- live555源码分析---- PLAY命令的处理
- java中字符串池,String池,共享池到底是怎么回事?
- javascript及基本语法
- SHELL排序
- lua语言基础
- Java中Runtime.getRuntime().exec()错误:Cannot allocate memory!