Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> 2 параллельных Thread wait()/notify(), как параллельность организовать 
V
    Опции темы
AbdulBcex
Дата 26.7.2010, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 6.11.2009

Репутация: нет
Всего: 1



Здраствуйте!

Тут такое дело. Есть код.
Код

while(isActive){

//Первая очередь
   synchronized(inputQueue){
    try {
        inputQueue.wait(10,1);
    } catch (InterruptedException e) {}                        
    }            
if(!inputQueue.isEmpty()){ 
    while(!inputQueue.isEmpty()){
      processingQueue();
   }}
//Вторая очередь                
    synchronized(inputQueue2){                        
    try {
          inputQueue2.wait(10,1);
    } catch (InterruptedException e) {}                
        }
if(!inputQueue2.isEmpty()){ 
                
    while(!inputQueue2.isEmpty()){
    processQueue2();
    }}}


Как (надеюсь smile ) видно, поток (а это именно Thread) пока active ждет 10ms+1ns одной очереди (если есть данные - обрабатывает их), потом переключается на другую... И так постоянно. Это вообще нормальная ситуация, так потоки гонять? Для быстродействия, надежности, например? Подскажите, а есть ли способ описать все это красивее, то есть, чтобы поток ждал одновременно notify() от обеих очередей и выполнял processing именно той очереди, которая отозвалась раньше. Чего-то я такого не нашел. Вероятность одновременного "отзыва" обеих очередей сведена к минимуму.
PM MAIL   Вверх
x8m6
Дата 26.7.2010, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 156
Регистрация: 11.12.2008

Репутация: нет
Всего: нет



А почему бы вам не сделать так, чтобы каждый поток обрабатывал свою очередь? 2-очереди -> 2 потока. Ну или можно сделать пул потоков на каждую очередь.
PM MAIL   Вверх
AbdulBcex
Дата 26.7.2010, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 6.11.2009

Репутация: нет
Всего: 1



Ну, во-первых, не позволяет особо уже написанный код. Во-вторых, таких объектов, с потоками может в теории быть очень много, что, думается, несомненно отразится на общей производительности. Сейчас их 3, а может быть пара десятков - то есть в районе 40 потоков. К тому же это не единственные потоки в программеsmile.
PM MAIL   Вверх
AbdulBcex
Дата 27.8.2010, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 6.11.2009

Репутация: нет
Всего: 1



Цитата

А почему бы вам не сделать так, чтобы каждый поток обрабатывал свою очередь? 2-очереди -> 2 потока. Ну или можно сделать пул потоков на каждую очередь.

Так и сделал в итоге.
Код

public class Operator2 implements Runnable{
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);
...
//который запускает две задачи у объекта 
run{
scheduler.schedule(inputQueueProcessor, 100, TimeUnit.NANOSECONDS);
scheduler.schedule(inputQueue2Processor, 150, TimeUnit.NANOSECONDS);
...
}}

Задачи - это те, что в первом моем посте после комментариев (подождал, обработал), только разбиты соответственно на две Runnable для scheduler. Основное изменение - inputQueue(2).wait(0) теперь (побольшей части) имеют в качестве временного параметра 0 - то есть ждут до отклика. Оказалось, что так лучше в плане производительности, чем гонять их постоянно в цикле.
Фишка в том, что у объекта Operator2 все же может возникнуть такая ситуация, когда inputQueueProcessor должен будет ждать с параметром 0, а inputQueueProcessor2 не будет тратить время, подождет 1ms например и пойдет дальше. Или наоборот, или обе сразу. На практике выходит, что второй поток в итоге будет ждать, пока закончит первый и вся "параллельность" на смарку.  

Подскажите, пожалуйста, что тут можно сделать? Как сделать так, что бы они действительно независимо друг от друга работали? Не соображу никак...  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0702 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.