Могу ли я контролировать порядок выполнения потоков с помощью CountDownLatch?

У меня есть задание. Мне нужно создать 4 службы A, B, C и D. У каждой службы должен быть свой поток. Служба должна запускаться только после того, как запущены все службы, от которых она зависит, и служба должна останавливаться только после того, как все зависящие от нее службы остановлены. Службы должны запускаться и останавливаться параллельно, когда это возможно. Службы B и C зависят от службы A. Служба D зависит от службы B. Чтобы запустить службу D, необходимо запустить службы A и B. Чтобы остановить службу A, сначала необходимо остановить службы B, D и C. Службы B и C можно запустить в параллельно сразу после начала А. И наоборот, они могут останавливаться параллельно.

Есть ли у вас какие-либо предложения, как решить эту проблему? Я пытаюсь сделать это последние 10 дней... Могу ли я сделать это с помощью CountDownLatch или чего-то еще? Любой совет ценен.


person njamanjam    schedule 13.06.2013    source источник
comment
Относится к: stackoverflow.com/questions/17090182/   -  person Gray    schedule 13.06.2013
comment
Также относится к: stackoverflow.com/questions/17072170/   -  person Gray    schedule 13.06.2013


Ответы (1)


Вы можете использовать очередь блокировки для связи между рабочими потоками и основным потоком, например

public static void main(String[] args) {
    BlockingQueue<String> queue = new LinkedBlockingQueue<>();
    Thread t1 = new Thread(new A(queue));
    t1.start();
    if(queue.take().equals("Started A")) {
        Thread t2 = new Thread(new B(queue));
        t2.start();
        Thread t3 = new Thread(new C());
        t3.start();
    }
    if(queue.take().equals("Started B")) {
        Thread t4 = new Thread(new D());
        t4.start();
    }
}

public class A implements Runnable {
    private BlockingQueue queue;
    private volatile boolean isCancelled = false;

    public A(BlockingQueue queue) {
        this.queue = queue;
    }

    public void cancel() {
        isCancelled = true;
    }

    public void run() {
        // initialization code
        queue.offer("Started A");
        while(!isCancelled) {
            ...
        }
        queue.offer("Stopped A");
    }
}

Используйте аналогичную логику для остановки потоков (используйте цикл while(!isCancelled) в своих службах и сделайте так, чтобы ваш основной поток вызывал cancel() в службах, когда пришло время их остановить).

person Zim-Zam O'Pootertoot    schedule 13.06.2013