Java - проблема LinkedBlockingQueue - PullRequest
0 голосов
/ 10 мая 2011
    1  LinkedBlockingQueue queJobs = new LinkedBlockingQueue(150);
    2  ..........
    3  .. Some other code....
    4  ..........
    5  Job curJob = queJobs.take();
    6  ....................
    7  .. Again some other code...
    8  ....................
    9  if(condition1){
    10    queJobs.put(curJob);
    11  } 
   

моя проблема в том, что когда условие1 истинно, я возвращаю объект в очередьно изначально он был в верхней части очереди, но после помещения он будет идти в конце очереди.Мое требование:1. Я могу вернуть элемент поверх очередиили же2. Каким-то образом я могу ждать в строке 5, не удаляя элемент из очереди.

Ответы [ 3 ]

3 голосов
/ 10 мая 2011

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

Если это не вариант, вы можете использовать peek (), чтобы получить, но не удалить curJob, а затем удалить его только if (!condition1).

UPDATE

но я использую take (), потому что он блокирует выполнение до тех пор, пока очередь не станет пустой.

peek () уж точно не будет работать для вас. Но я подозреваю недостаток в вашей общей логике тогда. Обычно вам не нужно ставить задания обратно в очередь. Возможно, лучшим решением будет использование другой коллекции, которая известна только рабочему потоку, где вы помещаете задания, которые вы начали, но еще не завершили, и читаете из этой коллекции перед очередью заданий.

1 голос
/ 10 мая 2011

Более естественным соответствием может быть использование PriorityBlockingQueue, которое позволит вам назначать приоритеты элементам.Это не совсем то, что вы просили, а просто предложение.

1 голос
/ 10 мая 2011

Вы можете использовать peek (), которая возвращает голову, но не удаляет ее.Затем проверьте, является ли условие 1 ложным.Если да, то удалите его с помощью take ().

Возможно добавить элемент обратно в голову, но это грязно.Вы можете вызвать toArray (). ToList (), который поддерживает добавление с индексом 0.

Ссылка: http://download.oracle.com/javase/6/docs/api/java/util/concurrent/LinkedBlockingQueue.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...