Как заблокировать и ждать с помощью AtomicBoolean

Я ищу способ приостановить Thread.

Я начал с аффективного использования булевского флага (называемого «приостановленным») и обертывания проверки с помощью цикла while (пауза).

Внутри цикла while существует Thread.wait() чтобы заблокировать выполнение.

Я смотрел на AtomicBoolean , который, кажется, делает трюк, кроме него, не блокируется.

Есть ли альтернативная или расширенная версия AtomicBoolean, которая имеет блочный метод?

т.е. что-то вроде AtomicBoolean.getFalse() AtomoicBoolean.get(false) ?

У них есть блокирующая очередь, поэтому значение блокировки.

Текущая настройка:

 while (paused.get()) { synchronized (paused) { try { paused.wait(); } catch (Exception e) { } paused.notify(); } } 

с

 public void pause() { if (paused.compareAndSet(false, true)) { synchronized (paused) { paused.notify(); } } } public void resume() { if (paused.compareAndSet(true, false)) { synchronized (paused) { paused.notify(); } } } 

  AtomicBoolean lock = new AtomicBoolean(false); if(lock.compareAndSet(false, true)){ try { //do something } catch(Exception e){ //error handling } finally { lock.set(false); } } 

Во-первых, если вы не используете атомную операцию (что-то вроде test-and-set), AtomicBoolean так же бесполезен, как обычный логический (если они изменяются). Здесь я использую compareAndSet , так что он входит только в критический раздел, если флаг был опущен. Не забудьте всегда разблокировать.

Чтобы приостановить stream с помощью флага, не переходите к активному ожиданию (какой-то цикл в корпусе нити спрашивает «Я приостановлен?»), Поскольку это не эффективная практика. Я бы использовал схему ожидания ожидания. Когда stream больше не работает, он вызывает wait на каком-то объекте. Затем, чтобы перезапустить, некоторые другие streamи вызовов notify об этом же самом объекте.

Если вы хотите немедленно приостановить (с точки зрения пропуска выполнения при установке флага), вы можете разделить код как можно больше шагов и обернуть каждый из них тестом, чтобы, наконец, подождать, если приостановлено:

 public void run(){ while(true){ if(!paused){ //do something } if(!paused){ //do something } if(!paused){ //do something } if(!paused){ //do something } if(paused){ //wait on some object } } } в public void run(){ while(true){ if(!paused){ //do something } if(!paused){ //do something } if(!paused){ //do something } if(!paused){ //do something } if(paused){ //wait on some object } } } 

В зависимости от вашего кода этапы могут быть даже вложенными или включать неделимые единицы исполнения с несколькими шагами.

Используйте CountDownLatch 1:

 CountDownLatch conditionLatch = new CountDownLatch(1); 

В том месте, где вы хотите подождать, пока какое-то условие станет истинным:

 conditionLatch.await(); 

В том месте, где вы хотите установить условие в true:

 conditionLatch.countDown(); 

Я не уверен, что понял ваш вопрос, так или иначе вы посмотрели на class java.util.concurrent.Semaphore? Семафор с разрешениями = 1 должен дать вам желаемое поведение, вы можете подражать своему

пауза = TRUE;

инструкции с

semaphore.tryAcquire ();

или

semaphore.acquire ();

если вы хотите заблокировать вызывающего абонента. Вы можете освободить stream с помощью

semaphore.release ();

Вы можете использовать блокировку.

В вашей теме.

 while(!Thread.interrupted()) { lock.lock(); try { // do something. } finally { lock.unlock(); } } // to pause lock.lock(); // to unpause lock.unlock(); // has to be the same thread which locked. 

Или вы можете заняться сном в зависимости от того, как быстро вам понадобится нить, чтобы проснуться.

 while(atomicBoolean.get()) Thread.sleep(100); // or yield(); 

Либо вы ожидаете определенного времени, которое может быть выполнено с помощью Thread.sleep() либо вам нужно ждать чего-то, что указывает на то, что вам нужно вызвать wait() для объекта, который вы ожидаете быть готовым.

Если вам действительно нужно вручную указать, чтобы ваш stream продолжал работать, постройте цикл while(true) содержащий Thread.sleep() и проверите логическое значение, которое приведет к break если он правильно установлен. На самом деле я не могу придумать причину сделать это.