Java Futures:有人可以向我解释程序流程

时间:2017-04-05 14:45:57

标签: java java-7 future

我对javascript承诺很好。所以我想尝试Java Futures(仍然停留在Java 7中)。但这些Java期货对我来说没有意义。以下是journaldev的修剪和修改版本:

import java.util.concurrent.*;

public class FutureTest {
    static class MyCallable implements Callable<String> {
        private long waitTime;
        MyCallable(int timeInMillis){
            this.waitTime=timeInMillis;
        }
        @Override
        public String call() throws Exception {
            Thread.sleep(waitTime);
            return Thread.currentThread().getName();
        }
    }

    public static void main(String[] args) throws Exception {
        MyCallable callable1 = new MyCallable(500);
        MyCallable callable2 = new MyCallable(1000);
        FutureTask<String> futureTask1 = new FutureTask<String>(callable1);
        FutureTask<String> futureTask2 = new FutureTask<String>(callable2);

        ExecutorService executor = Executors.newFixedThreadPool(2);
        executor.execute(futureTask2);
        executor.execute(futureTask1);

        while (true) {
            try {
                boolean done1 = futureTask1.isDone();
                boolean done2 = futureTask2.isDone();

                if(futureTask1.isDone() && futureTask2.isDone()){
                    System.out.println("Done");
                    executor.shutdown();
                    return;
                }

                System.out.println("Done1:" + done1 + " - 2:" + done2);

                String x = futureTask1.get(100L, TimeUnit.MILLISECONDS);
                if (x != null)
                    System.out.println("FutureTask1 output="+x);
                else
                    System.out.println("Waiting for FutureTask1");

                String s = futureTask2.get(200L, TimeUnit.MILLISECONDS);
                if(s != null)
                    System.out.println("FutureTask2 output="+s);
                else
                    System.out.println("Waiting for FutureTask2");

                Thread.sleep(100);
            } catch(TimeoutException e) {} 
        }
    }
}

它的输出是:

Done1:false - 2:false
Done1:false - 2:false
Done1:false - 2:false
Done1:false - 2:false
Done1:false - 2:false
FutureTask1 output=pool-1-thread-2
Done1:true - 2:false
FutureTask1 output=pool-1-thread-2
Done1:true - 2:false
FutureTask1 output=pool-1-thread-2
FutureTask2 output=pool-1-thread-1
Done

为什么Waiting for FutureTaskX系统没有执行?我希望主线程循环和系统输出Waiting for ...,直到期货得到解决。

我对解决此问题的不同方法不感兴趣,仅在此代码的程序流程中。感谢。

2 个答案:

答案 0 :(得分:1)

代码永远不会到达“Waiting for FutureTask1”行。

如果futureTask1.get未在超时时间内返回值,则会引发TimeoutException

唯一一次返回而不抛出异常,xs不再为空。

请参阅FutureTask get documentation

答案 1 :(得分:1)

由于futureTask1.get(100L, TimeUnit.MILLISECONDS)会抛出TimeoutException,因此futureTask1睡眠时间为500毫秒,futureTask2会出现同样的问题。

也许您需要Waiting for FutureTask catch子句中的输出TimeoutExceptionsleep块中的finally,可能是这样的:

try {
...
} catch (TimeoutException e) {
   System.out.println("Waiting for FutureTask");
} finally {
   Thread.sleep(100);
}