Java Как я могу контролировать что-то постоянно без 100% загрузки процессора? - PullRequest
0 голосов
/ 15 января 2011

Могу ли я просто использовать цикл while совместно с wait () и notify () / notifyall ()?

EDIT: я хочу, чтобы условие else метода waitfornextprice выполнялось только наМетод putPrice происходит.

public synchronized void putPrice(String s,int i) {
     if (getPrice(s) != i){
         this.Prices.put(s, i);
         notify();
     } 
}

public synchronized int waitForNextPrice(String s) {
    int b = null;
    if (hasPriceChanged(s)==true){
        b = getPrice(s);
    }
    else{
        //Need to block here, until putPrice() is called again
        while(hasPriceChanged(s)==false) wait();

        //Once putPrice has been called, b = getPrice();
        b = getPrice(s);
    }
    return b;
}

Ответы [ 4 ]

5 голосов
/ 15 января 2011

Предполагая, что то, что вы пытаетесь контролировать, способно вызвать notify / notifyAll, это типичный способ сделать это, да.

Если оно не может вас уведомить, вы можетеопрос вместо ... но "push" уведомление с wait / notify предпочтительнее.

3 голосов
/ 15 января 2011

Вы также можете выполнить цикл с помощью функции Sleep () в цикле, и это увеличит загрузку вашего процессора от 100% до почти 1%.Просто добавьте сон (50);в вашем цикле

1 голос
/ 15 января 2011

Обычно есть лучший способ, чем использовать ожидание / уведомление.Можете ли вы объяснить, что вы пытаетесь сделать, и, возможно, мы можем предложить альтернативы, например, использовать библиотеку параллелизма в Java.

Гораздо лучшая структура - это использование управляемой событиями обработки.Когда цена меняется, вы хотите, чтобы конкретные действия происходили.Вы должны инициировать эти действия из-за изменения цены.

public void putPrice(String s,int i) {
  if (getPrice(s) == i) return;
  prices.put(s, i);
  List<Runnable> onChange = priceListeners.get(s);
  if (onChange==null) return;
  for(Runnable run: onChange) run.run();
}

Вместо использования Runnable вы можете создать интерфейс, который уведомляет, какой ключ / цена изменились.Таким образом, вы можете изменить любое количество цен только одной веткой.(Или небольшое количество тем по вашему выбору)

1 голос
/ 15 января 2011

Почему бы вам не использовать java.util.Timer вместо дорогого цикла?

...