我正在尝试实现一个线程安全的解决方案来记录已完成的成功任务的计数,这些任务最终将绑定到 UI 上显示的标签。但是,当我使用下面的 AtomicInteger 时,它会在任务开始运行时锁定我的 UI,但是,如果我删除所有 AtomicInteger 引用,一切正常。是否有一种非阻塞、线程安全的方式可以实现这一点?
public void handleSomeButtonClick(){
if(!dataModel.getSomeList().isEmpty()) {
boolean unlimited = false;
int count = 0;
AtomicInteger successCount = new AtomicInteger(0);
if(countSelector.getValue().equalsIgnoreCase("Unlimited"))
unlimited = true;
else
count = Integer.parseInt(countSelector.getValue());
while(unlimited || successCount.get() < count) {
Task task = getSomeTask();
taskExecutor.submit(task);
task.setOnSucceeded(event -> {
if (task.getValue())
log.info("Successfully Completed Task | Total Count: " + successCount.incrementAndGet());
else
log.error("Failed task");
});
}
}
}