Что такое Java-эквивалент ManualResetEvent? [Дубликат]

Только для получения значения строки версии ОС:

[[UIDevice currentDevice] systemVersion]
30
задан Lucero 30 June 2009 в 16:29
поделиться

5 ответов

Ближайший из известных мне - семафор . Просто используйте его с числом «разрешений», равным 1, и получение / выпуск будет примерно таким же, как и то, что вы знаете из ManualResetEvent .

Семафор инициализирован в единицу, и который используется так, что он имеет только имеется почти одно разрешение, может служить как блокировку взаимного исключения. Это более известный как двоичный семафор, потому что у него всего два заявляет: имеется одно разрешение или ноль разрешения имеются. При использовании в этом Кстати, двоичный семафор имеет собственность (в отличие от многих Lock реализациях), что "замок" может быть выпущенным потоком, отличным от владелец (поскольку семафоры не имеют понятия владение). Это может быть полезно в некоторых специализированные контексты, такие как тупик восстановление.

19
ответ дан 27 November 2019 в 23:45
поделиться

Попробуйте CountDownLatch со счетом один.

CountDownLatch startSignal = new CountDownLatch(1);
8
ответ дан 27 November 2019 в 23:45
поделиться

На основе:

ManualResetEvent позволяет потокам обмениваться данными друг с другом сигнализация. Обычно это общение касается задачи, которая один поток должен завершиться раньше другого потоки могут продолжаться.

отсюда:

http://msdn.microsoft.com/en-us/library/system.threading.manualresetevent.aspx

вы, возможно, захотите посмотреть на барьеры в Java пакет параллелизма - в частности CyclicBarrier Я считаю:

http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/CyclicBarrier.html

Это блокирует фиксированное количество потоков до тех пор, пока не произойдет конкретное событие. Все нити должны сходиться в точке барьера .

3
ответ дан 27 November 2019 в 23:45
поделиться

Я считаю суть. NET MRE - это сходство потоков и его способность пропускать все ожидающие потоки при вызове Set. Я обнаружил, что использование семафора работает хорошо. Однако, если меня ждут 10 или 15 потоков, я сталкиваюсь с другой проблемой. В частности, это происходит при вызове Set. В .Net все ожидающие потоки освобождаются. Использование семфора не освобождает всех. Так что я завернул это в класс. ПРИМЕЧАНИЕ. Я хорошо знаком с потоками .NET. Я относительно новичок в потоковой передаче и синхронизации Java. Тем не менее, я готов вмешаться и получить реальную обратную связь. Вот моя реализация с предположениями, которые сделает новичок в Java:

public class ManualEvent {
private final static int MAX_WAIT = 1000;
private final static String TAG = "ManualEvent"; 
private Semaphore semaphore = new Semaphore(MAX_WAIT, false);

private volatile boolean signaled = false;
public ManualEvent(boolean signaled) {
    this.signaled = signaled; 
    if (!signaled) {
        semaphore.drainPermits();
    }
}

public boolean WaitOne() {
    return WaitOne(Long.MAX_VALUE);
}

private volatile int count = 0;
public boolean WaitOne(long millis) {
    boolean bRc = true;
    if (signaled)
        return true;

    try {
        ++count;
        if (count > MAX_WAIT) {
            Log.w(TAG, "More requests than waits: " + String.valueOf(count));
        }

        Log.d(TAG, "ManualEvent WaitOne Entered");
        bRc = semaphore.tryAcquire(millis, TimeUnit.MILLISECONDS);
        Log.d(TAG, "ManualEvent WaitOne=" + String.valueOf(bRc));
    }
    catch (InterruptedException e) {
        bRc = false;
    }
    finally {
        --count;
    }

    Log.d(TAG, "ManualEvent WaitOne Exit");
    return bRc;
}

public void Set() {
    Log.d(TAG, "ManualEvent Set");
    signaled = true;
    semaphore.release(MAX_WAIT);
}

public void Reset() {
    signaled = false;
    //stop any new requests
    int count = semaphore.drainPermits();
    Log.d(TAG, "ManualEvent Reset: Permits drained=" + String.valueOf(count));
}

}

Также обратите внимание, что я в основном делаю ставку на то, что в любой момент времени ожидает релиза не более 1000 запросов. Выпуская и получая пакеты, я пытаюсь освободить все ожидающие потоки.

2
ответ дан 27 November 2019 в 23:45
поделиться
class ManualResetEvent {

  private final Object monitor = new Object();
  private volatile boolean open = false;

  public ManualResetEvent(boolean open) {
    this.open = open;
  }

  public void waitOne() throws InterruptedException {
    synchronized (monitor) {
      while (open==false) {
          monitor.wait();
      }
    }
  }

  public boolean waitOne(long milliseconds) throws InterruptedException {
    synchronized (monitor) {
      if (open) 
        return true;
      monitor.wait(milliseconds);
        return open;
    }
  }

  public void set() {//open start
    synchronized (monitor) {
      open = true;
      monitor.notifyAll();
    }
  }

  public void reset() {//close stop
    open = false;
  }
}
27
ответ дан 27 November 2019 в 23:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: