Как мне использовать Threads для выполнения функции, если в ArrayList есть элементы? - PullRequest
2 голосов
/ 11 декабря 2011

Я пытаюсь переместить мой код обработки клиентской сети в другой поток, чтобы он не зависал при обработке пакета.

В основном у меня есть ArrayList полученных пакетов.Поток выполняет бесконечный цикл while, обрабатывая любые новые пакеты.Однако это увеличивает нагрузку на мой процессор до 100%, потому что, даже если нет новых пакетов, он все равно работает постоянно.

То, что я хочу сделать, - это спящий поток обработки, и мой поток уведомляет его, когда появляются новые пакеты.

Я кодирую это на Java.

РЕДАКТИРОВАТЬ:

Это то, что я стремлюсь достичь -

// Main Thread
// Listener
public void newPacketReceived(){
    receiverThread.addNewPacketToProcessingQueue(null);

}

// Receiver Thread
ArrayList<GamePacket> processingQueue = new ArrayList<GamePacket>();

public void addNewPacketToProcessingQueue(GamePacket packet){
    processingQueue.add(packet);
    this.notify();
}

public void run(){
    while(true){
        // Process Packets
        this.sleep(); // Sleep until thread is notified 
    }
}

Ответы [ 3 ]

5 голосов
/ 11 декабря 2011

Вместо использования ArrayList используйте BlockingQueue некоторого описания (например, LinkedBlockingQueue). Это предназначено именно для такого случая использования.

Код производителя будет использовать offer для предложения нового элемента, а поток обработки будет использовать poll с таймаутом для блокировки (дешево), пока элемент не присутствует.

0 голосов
/ 11 декабря 2011

Без некоторого кода было бы сложно помочь, но я предлагаю запустить один поток с помощью do ... while (ArrayList.size ()> 0), а затем запустить другой поток, чтобы постоянно проверять размер массива, если что-то добавить, он запустит 1-й поток и остановит его, как только достигнет нуля.

Надеюсь, это поможет.

0 голосов
/ 11 декабря 2011

Вы можете просто добавить Thread.sleep(100) в свой цикл во время ожидания ввода.

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

Если вас беспокоит потеря времени во время ожидания, вы можете попробовать Thread.sleep(0). Обычно это не очень хорошая практика, но для игр иногда используется (по крайней мере, на других языках - не пробовал на Java). В некоторых системах это просто откажется от временного интервала.

...