Java Futures:谁能给我解释一下程序流程

Java Futures: Could someone explain me the program flow

我对 java脚本承诺没问题。所以我想尝试 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 ... 直到 Futures 被解决。

我对解决这个问题的不同方法不感兴趣,只对这段代码的程序流程感兴趣。谢谢。

代码从未到达 "Waiting for FutureTask1" 行。

如果 futureTask1.get 在超时时间内没有 return 值,则抛出 TimeoutException

唯一一次 return 没有抛出异常,xs 不再为空。

参见FutureTask get documentation

因为futureTask1.get(100L, TimeUnit.MILLISECONDS)会抛出TimeoutException,因为futureTask1休眠时间是500毫秒,futureTask2有同样的问题。

也许你需要在 TimeoutException catch 子句中输出 Waiting for FutureTask,在 finally 块中输出 sleep,可能像:

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