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 没有抛出异常,x
和 s
不再为空。
因为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);
}
我对 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 没有抛出异常,x
和 s
不再为空。
因为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);
}