我构建以下演示代码来测试 java.util.concurrent.CompletableFuture.runAsync 函数:
import java.util.ArrayList;
import java.util.List;
public class TestClass {
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
java.util.concurrent.CompletableFuture.runAsync( () ->{startCall(1);});
java.util.concurrent.CompletableFuture.runAsync( () ->{startCall(2);});
java.util.concurrent.CompletableFuture.runAsync( () ->{startCall(3);});
//Add sleep if case mainthread is to fast
Thread.sleep(1000);
while (!RunningTasks.isEmpty());
System.out.println("Shutting down");
}
private static List<String> RunningTasks=new ArrayList<String>();
private static void startCall(int cn) {
RunningTasks.add("TASK"+cn);
int sleeptime = (int) (Math.random()*10*1000);
System.out.println("Sleeptimer: "+sleeptime+" for instance: "+cn);
try {
Thread.sleep(sleeptime);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Task "+cn+" finished");
RunningTasks.remove("TASK"+cn);
System.out.println("RunningTasks: "+RunningTasks.size() +" is empty? "+RunningTasks.isEmpty());
}
}
如果我在 Eclipse 中以正常模式运行此代码(因此只需点击运行),一切都会按预期工作,而 while 循环似乎永远不会真正停止,意味着“关闭”永远不会被打印。
如果我在调试模式下运行代码并在条件上设置断点RunningTasks: 0 为空?真的被打印出来, while 检测到条件为假并退出。
如果我添加一些代码,例如将 sysout 命令放入 while 循环中,它也会按预期退出。
我错过了什么或者这确实是一个 Java 错误吗?
运行代码时,程序可能会得到优化。因此,您的计算机可能会缓存 while 循环中的条件结果。如果你想阻止这种缓存,你可以这样写:
private static volatile List<String> RunningTasks=new ArrayList<String>();
The keyword volatile
告诉计算机不要缓存结果,以便您真正查找结果RunningTasks.isEmpty()
在每次迭代中不使用缓存值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)