求Callable和Runnable的示例代码,兼庆祝第一次发帖

墨水鱼 2008-06-30 10:51:18
从高中注册,8年来第一次发帖!

看了java.util.concurrent包,有个问题:FutureTask(Runnable runnable, V result)怎么让返回result,求一简单示例代码。
要求:
1.使用FutureTask(Runnable runnable, V result)方法,并且返回一个非null的result。
2.一个完整的含有main(String[] args)的类。

希望能尽快结贴。48小时内如果没有满意答案也结贴。
...全文
140 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
linsingle 2012-02-28
  • 打赏
  • 举报
回复
import java.util.concurrent.FutureTask;


public class FutureCallableDemo {
public static long fibonacci(long n) {
if(n <=1) {
return n;
} else {
return fibonacci(n-1) + fibonacci(n-2);
}
}
/**
* @param args
*/
public static void main(String[] args) {
class Result {
private long result;
}
final Result r = new Result();
FutureTask<Result> fib30 = new FutureTask<>(
new Runnable() {
@Override
public void run() {
r.result = fibonacci(30);
}

}
, r);
System.out.println("老闆,我要第30個費式數,待會來拿...");
new Thread(fib30).start();
System.out.println("忙別的事去...");
try {
Thread.sleep(5000);
System.out.printf("第30個費式數:%d%n", fib30.get().result);
} catch(Exception ex) {
ex.printStackTrace();
}
}

}
Sou2012 2008-07-01
  • 打赏
  • 举报
回复
关注一下,,楼主真强
purple.taro 2008-07-01
  • 打赏
  • 举报
回复
关注一下
havelock 2008-07-01
  • 打赏
  • 举报
回复
runnable返回一个返回值??这玩意本来就没有返回值,如果想要有的话
用callable吧.callable在1.5里面加近来就是为了解决这个问题的.
墨水鱼 2008-07-01
  • 打赏
  • 举报
回复
可能是我没有把要求讲清楚。

Callable返回一个值我是知道的,我就是不知道怎样让Runnable返回一个计算完的值。

比如怎样让Runnable在新的线程生成一个随机整数,然后返回这个整数。
havelock 2008-07-01
  • 打赏
  • 举报
回复
Thinking in java 4
上的源码
//: concurrency/CallableDemo.java
import java.util.concurrent.*;
import java.util.*;
class TaskWithResult implements Callable<String> {
private int id;
public TaskWithResult(int id) {
this.id = id;
}
public String call() {
return "result of TaskWithResult " + id;
}
}
public class CallableDemo {
public static void main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPool();
ArrayList<Future<String>> results =
new ArrayList<Future<String>>();
for(int i = 0; i < 10; i++)
results.add(exec.submit(new TaskWithResult(i)));
for(Future<String> fs : results)
try {
// get() blocks until completion:
System.out.println(fs.get());
} catch(InterruptedException e) {
System.out.println(e);
return;
} catch(ExecutionException e) {
System.out.println(e);
} finally {
exec.shutdown();
}
}
} /* Output:
result of TaskWithResult 0
result of TaskWithResult 1
result of TaskWithResult 2
result of TaskWithResult 3
result of TaskWithResult 4
result of TaskWithResult 5
result of TaskWithResult 6
result of TaskWithResult 7
result of TaskWithResult 8
result of TaskWithResult 9
npuhetao 2008-07-01
  • 打赏
  • 举报
回复
re
[Quote=引用 10 楼 jishu_vip 的回复:]
package test;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class TestFutureTask {
public static void main(String[] args)throws InterruptedException,ExecutionException{
final ExecutorService exec = Executors.new…
[/Quote]
jishu_vip 2008-07-01
  • 打赏
  • 举报
回复
package test;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class TestFutureTask {
public static void main(String[] args)throws InterruptedException,ExecutionException{
final ExecutorService exec = Executors.newFixedThreadPool(5);
Callable call = new Callable(){
public String call() throws Exception {
Thread.sleep(1000 * 5);
return "Other less important but longtime things.";
}
};
Future task = exec.submit(call);
//重要的事情
Thread.sleep(1000 * 3);
System.out.println("Let’s do important things.");
// 其他不重要的事情
String obj = (String)task.get();
System.out.println(obj);
// 关闭线程池
exec.shutdown();
}

}
havelock 2008-07-01
  • 打赏
  • 举报
回复
这个FutureTask 类就是将一个Callable的转换成Runnable并执行,或者执行一个Runnable的,计算完成后返回传进的result对象.
注释掉的部分就是执行Callable的, 后面没有注释的部分是返回result的.

另外,似乎FF上不能粘源代码??
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class Task {
public static void main(String[] args){
// FutureTask<String> task = new FutureTask<String>(new Cal());
// Thread t=new Thread(task);
// t.start();
// try {
// System.out.println(task.get());
// } catch (InterruptedException e) {
// e.printStackTrace();
// } catch (ExecutionException e) {
// e.printStackTrace();
// }
FutureTask<String> task=new FutureTask<String>(new Thre(),"complete");
Thread t= new Thread(task);
t.start();
try {
System.out.println(task.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}

class Thre implements Runnable{

public void run() {
System.out.println("Runnable");
}

}
class Cal implements Callable{

public Object call() throws Exception {
System.out.println("called in Cal");
return "called";
}
}
墨水鱼 2008-07-01
  • 打赏
  • 举报
回复
加到200分了,高分救助。
兼顶贴
墨水鱼 2008-06-30
  • 打赏
  • 举报
回复
还有个问题,送给1楼的马甲多少分能让马甲到星星?
墨水鱼 2008-06-30
  • 打赏
  • 举报
回复
如果只有一人回答正确则给100分。
两人以上回答,每个相似的回答给首个回复的50分,其余5分。
无意义回复不给分。

给分不是问题,上限500分。
zhj92lxs 2008-06-30
  • 打赏
  • 举报
回复
庆祝
zhj92lxs 2008-06-30
  • 打赏
  • 举报
回复
没有,帮顶

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧