Как делают потоки, которые полагаются друг на друга, связываются в Java?
Например, я создаю поисковый робот с потоками, которым нужны данные, которые прибывают из других потоков.
, который зависит от характера общения.
и так далее.
Самая простая и наиболее целесообразная форма взаимодоводской связи - просто ждать завершения других потоков. Это наиболее легко делается с использованием будущего
:
ExecutorService exec = Executors.newFixedThreadPool(50);
final Future f = exec.submit(task1);
exec.submit(new Runnable() {
@Override
public void run() {
f.get();
// do stuff
}
});
Вторая задача не будет выполняться до первого завершения.
Java 5+ имеет Многие одновременных коммунальных услуг для борьбы с такими вещами. Это может означать использование LinkedBlockingQueue
S, CountDownlatch
или многие другие.
Для углубленного обследования параллелизма Java Consullence на практике является обязательным чтением.
Взгляните на java.util.Observer/java.util.Observable. Это именно то, что вы ищете.
Можно использовать 2 Исполнительские услуги, отправить вызываемую реализацию в сервис А, который знает о последующих действиях по сервису Б. Когда вызываемый абонент завершил свою работу, он отправляет в сервис Б новое задание, которое делает что-то дополнительное с результатами.
Можно воспользоваться функцией CountDownLatch или каким-либо другим барьером, если необходимо выполнить дополнительную работу после того, как все элементы будут обработаны в обеих службах.
ExecutorService api довольно прямолинейна, по большей части вы, вероятно, будете использовать что-то вроде .newFixedThreadPool(int threads) и отправлять ему Runnables/Callables.