从高中注册,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 类就是将一个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";
    }
    }
      

  2.   

    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();  
    }}
      

  3.   

    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
      

  4.   

    可能是我没有把要求讲清楚。Callable返回一个值我是知道的,我就是不知道怎样让Runnable返回一个计算完的值。比如怎样让Runnable在新的线程生成一个随机整数,然后返回这个整数。
      

  5.   

    runnable返回一个返回值??这玩意本来就没有返回值,如果想要有的话
    用callable吧.callable在1.5里面加近来就是为了解决这个问题的.
      

  6.   

    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();
    }
    }}