«решил» это с помощью «фиктивных сообщений» повсюду.Это плохая идея?Каковы возможные решения?
Это неплохая идея, она называется «Ядовитые пилюли» и является разумным способом остановить службу на основе потоков.
Но она работает только тогда, когдачисло производителей и потребителей известно.
В размещенном вами коде есть два потока: один - «основной поток», который производит данные, другой - «поток обработки», который потребляет данные, ««Отравляющие таблетки» хорошо подходит для этого обстоятельства.
Но чтобы представить, если у вас есть и другие производители, как потребитель узнает, когда следует остановиться (только когда все производители отправляют «Отравляющие таблетки»), вам необходимо точно знать,количество всех производителей, а также проверить количество «Ядовитых таблеток» у потребителя, если оно равняется количеству производителей, что означает, что все производители перестали работать, то потребитель останавливается.
In »основной поток", вам нужно поймать InterruptedException
, так как в противном случае" основной поток "может не установить" Ядовитую пилюлю ".Вы можете сделать это, как показано ниже,
...
try {
// do normal processing
} catch (InterruptedException e) { /* fall through */ }
finally {
MyObject dummy = new MyObject();
dummy.setData("END");
...
}
...
Кроме того, вы можете попробовать использовать ExecutorService
для решения всех ваших проблем.
(Это работает, когда вам просто нужно выполнить некоторые работы, а затем остановиться, когда все закончится)
void doWorks(Set<String> works, long timeout, TimeUnit unit)
throws InterruptedException {
ExecutorService exec = Executors.newCachedThreadPool();
try {
for (final String work : works)
exec.execute(new Runnable() {
public void run() {
...
}
});
} finally {
exec.shutdown();
exec.awaitTermination(timeout, unit);
}
}
Я учусь и не хочу начинать "делать"это неправильный путь "
Возможно, вам придется прочитать Книгу: Параллелизм Java на практике.Поверь мне, это лучшее.