我没想到线程会是这么困难的叹息。无论如何,我能想到在线程完成后执行函数的唯一方法是使用静态计数器在线程运行时递增。
if(++threadcounter==3){doSomething(); threadcounter =0;}
Run Code Online (Sandbox Code Playgroud)
我发现这不是一个好主意,因为线程计数器有时永远不会达到 4。
所以我使用了原子整数
if(atomicint.incrementAndGet()==4){doSomething(); atomicint.set(0);}
Run Code Online (Sandbox Code Playgroud)
计数器为 5 或 0,应用程序冻结。我不知道发生了什么。如何使用正确的计数器?谢谢
编辑:
解决这个问题的最简单方法是使用一个很好的老式锁:
boolean shouldDoSomething;
synchronized {
++threadCounter;
if (threadCounter == 4) {
threadCounter = 0;
shouldDoSomething = true;
}
else {
shouldDoSomething = false;
}
}
if (shouldDoSomething) doSomething();
Run Code Online (Sandbox Code Playgroud)
这将在锁上产生争用,但会通过一段非常非常简短的代码——加载、存储和一些算术指令。
您的使用AtomicInteger是错误的,因为没有锁定或其他并发控制链接incrementAndGet和set,这意味着存在潜在的竞争条件(值为 3,线程 A 增加到 4,线程 B 增加到 5,线程 A 设置为 0 )。