2015-06-13 7 views
7

У меня есть тема, которая имеет только работать, когда определенное обстоятельство приходит иначе он просто перебирает пустой бесконечный цикл:.Java производительность бесконечного цикла

public void run() { 
    while(true) { 
     if(ball != null) { 
      // do some Calculations 
     } 
    } 
} 

ли это влияет на производительность, когда цикл фактически делает ничего, но он должен проверить, нужно ли делать вычисления на каждой итерации? Только создание этого потока при необходимости для меня не является вариантом, потому что мой класс, который реализует Runnable, является визуальным объектом, который будет отображаться все время.

Редактировать: так ли хорошее решение? Или лучше использовать другой метод (относительно производительности)?

private final Object standBy = new Object(); 

public void run() { 
    while(true) { 
     synchronized (standBy) { 
      while(ball != null) // should I use while or if here? 
       try{ standBy.wait() } 
       catch (InterruptedException ie) {} 
     } 
     if(ball != null) { 
      // do some Calculations 
     } 
} 

public void handleCollision(Ball b) { 
    // some more code.. 
    ball = b; 
    synchronized (standBy) { 
     standBy.notify(); 
    } 
} 
+2

Используйте 'BlockingQueue'; этот бесконечный цикл будет потреблять все время процессора. – twentylemon

+1

Нет никаких обстоятельств, в которых эта нить не работает. Это всегда делает работу. –

+1

Есть ли у вашего компьютера запасной процессор? Если у вас достаточно процессоров, то непрерывно работающая нить дешевая. Если нет, это стоит вам. –

ответ

7

Возможно, вы захотите рассмотреть вопрос о том, чтобы положить поток в сон и только просыпать его, только когда ваша переменная «шарик» станет истиной. Существует несколько способов сделать это, начиная с использования очень низкого уровня, wait и notify инструкций с использованием классов java.util.concurrent, которые обеспечивают менее склонный к ошибкам способ сделать это. Посмотрите документацию для интерфейса condition. Также была бы решена структура данных, такая как BlockingQueue.

2

Да, это, безусловно, повлияет на производительность. Чтобы повысить производительность, вы можете подумать о том, чтобы заложить немного времени (например, 500 мс или 1000 мс или даже выше) в вашем коде, в зависимости от того, насколько важно для вас время.

3

Разделите BlockingQueue между вашими нитями.

class Producer implements Runnable { 
    private final BlockingQueue queue; 
    Producer(BlockingQueue q) { queue = q; } 
    public void run() { 
    try { 
     while (true) { queue.put(produce()); } 
    } catch (InterruptedException ex) { ... handle ...} 
    } 
    Object produce() { ... } 
} 

class Consumer implements Runnable { 
    private final BlockingQueue queue; 
    Consumer(BlockingQueue q) { queue = q; } 
    public void run() { 
    try { 
     while (true) { consume(queue.take()); } 
    } catch (InterruptedException ex) { ... handle ...} 
    } 
    void consume(Object x) { ... } 
} 
7

Да, это так. Это самая простая реализация busy waiting, и ее следует избегать, когда это возможно. Используйте wait/notify или java.util.concurrent. Может быть, вы должны быть более конкретными о том, что именно вы хотите достичь, чтобы получить более полезные ответы.

Смежные вопросы