我不认为穿线会是一件难事。
无论如何,我想到线程完成后执行功能的唯一方法是每当线程运行时都使用静态计数器来递增。

if(++threadcounter==3){doSomething(); threadcounter =0;}

我发现这不是一个好主意,因为线程计数器有时从未达到4。

所以我用原子整数
if(atomicint.incrementAndGet()==4){doSomething(); atomicint.set(0);}

计数器为5或0,应用程序冻结。我不知道发生了什么如何使用正确的计数器?
谢谢

编辑:

最佳答案

解决此问题的最简单方法是使用好的老式锁:

boolean shouldDoSomething;
synchronized {
    ++threadCounter;
    if (threadCounter == 4) {
        threadCounter = 0;
        shouldDoSomething = true;
    }
    else {
        shouldDoSomething = false;
    }
}
if (shouldDoSomething) doSomething();

这将在锁上产生争用,但是会涉及非常非常简短的代码段-加载,存储和一些算术指令。

您对AtomicInteger的使用是错误的,因为没有链接incrementAndGetset的锁定或其他并发控件,这意味着存在潜在的竞争条件(值是3,线程A递增到4,线程B递增到5,线程A设置为0)。

10-01 18:18