Я думаю, что ваш дизайн может нарушать какое-то важное правило в разработке программного обеспечения, имя которого ускользает от меня в данный момент.В идеале у вас должен быть один класс, ответственный за одну вещь, поэтому просьба к классам изменить то, за что они отвечают в зависимости от внешнего состояния, вызовет у вас некоторые проблемы.
Я бы порекомендовал вам взять Производитель / Потребительская Скороговорка во внимание.Ваш поток (ы) продюсера добавит работу в очередь, а поток потребителя обработает ее.Это гарантирует, что вашим потокам-производителям не нужно заботиться о том, когда они отвечают за получение работы из очереди, а когда они отвечают за размещение работы в очереди, все, о чем они заботятся, - это помещает работу в очередь.Ваш потребительский поток будет посвящен извлечению работы из очереди и ее выполнению, и это все, что он сделает!
Обновите базу на основе вашего комментария: производитель не должен быть выделенным,все, что вам нужно сделать - это сделать так, чтобы ваш обратный вызов read поставил в очередь рабочий элемент (я полагаю, это что-то вроде обратного вызова, но поправьте меня, если я ошибаюсь).Вот и снова:
private static BlockingQueue q;
// Asynchronous callback
public void read()
{
q.enqueue(new WorkItem());
}
Возможно, потребителю нужно быть преданным, но концептуально существует очень мало различий между выделением потребителя и тем, чтобы несколько производителей играли исключительную роль в качестве потребителя:
public class Consumer imlpements Runnable {
private BlockingQueue _queue;
public Consumer(BlockingQueue q){
_queue = q;
}
public void run(){
while(true){
// block on dequeue until there is work in the queue (i.e. never exits the loop)
WorkItem w = _queue.dequeue();
w.DoWork();
}
}
}
Теперь вы можете запустить и Потребителя и Производителя (ей) в пуле потоков (ExecutorService), и он будет выполнять именно то, что вы хотите.Обратите внимание, что я не включил все навороты безопасности потоков, такие как перехват исключений прерываний и корректное завершение, но это то, что вы можете (и должны) добавить.