从高中注册,8年来第一次发帖!看了java.util.concurrent包,有个问题:FutureTask(Runnable runnable, V result)怎么让返回result,求一简单示例代码。
要求:
1.使用FutureTask(Runnable runnable, V result)方法,并且返回一个非null的result。
2.一个完整的含有main(String[] args)的类。希望能尽快结贴。48小时内如果没有满意答案也结贴。
要求:
1.使用FutureTask(Runnable runnable, V result)方法,并且返回一个非null的result。
2.一个完整的含有main(String[] args)的类。希望能尽快结贴。48小时内如果没有满意答案也结贴。
解决方案 »
- 几个QQ群都不能解释的问题:自定义Exception的子类(子类继承Exception类,并未作任何修改),却不能捕捉原来Excepton能捕捉的异常,为什么?
- 怎么把两个控件组合在一起
- 第一次看到的java语句,真不知道是什么意思?
- 求指教。。。关于Java GUI的布局问题(急)
- TOMCAT中文路径问题,谢谢
- 下拉列表框问题
- 关于Servlet和UTF-8 的一些问题
- 如何对出力到excel的字符进行游对齐?
- 急急急急!在c通过jni调用java过程中遇到的麻烦,麻烦各位帮帮忙
- about ibm visualage3.0的问题
- PreparedStatement 插入空值
- 求FutureTask(Runnable runnable, V 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";
}
}
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();
}}
上的源码
//: 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
用callable吧.callable在1.5里面加近来就是为了解决这个问题的.
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();
}
}}