Я часто использую следующий шаблон, чтобы создать Cancellable тему:Нужно ли AtomicBoolean создать отменную нить?
public class CounterLoop implements Runnable {
private volatile AtomicBoolean cancelPending = new AtomicBoolean(false);
@Override
public void run() {
while (!cancelPending.get()) {
//count
}
}
public void cancel() {
cancelPending.set(true);
}
}
Но я не уверен, что cancelPending ДОЛЖЕН быть AtomicBoolean. Можем ли мы просто использовать нормальное булево значение в этом случае?
правило большого пальца: если вы не используете CAS, вам не нужен AtomicXXX. 2-е правило: если вам нужно протестировать/изменить (и изменить можно перейти в несколько состояний), вам нужен CAS. Следовательно, в вашем случае вам не нужен AtomicXXX, но вместо этого вы можете использовать Thread.interrupt. 'interrupt()' также больше подходит (может отменить блокировку и может отменить IO). В вашем случае, если вы идете w/AtomicXXX, вы должны сделать его окончательным, а не изменчивым. – bestsss