Есть ли лучший способ перезапустить java темы? - PullRequest
0 голосов
/ 05 апреля 2020

1) Есть ли лучший способ перезапустить потоки?

2) Можно ли так часто вызывать Thread.isAlive()?

3) Если нет, можете ли вы посоветовать другое решение? для этого?

class AllActions{
    LinkedBlockingQueue<String> action1list = new LinkedBlockingQueue<>();
    LinkedBlockingQueue<String> action2list = new LinkedBlockingQueue<>();
    LinkedBlockingQueue<String> action3list = new LinkedBlockingQueue<>();

    doActions(List<String> actions){

    action1list.addAll(actions);

    Thread action1Thread = new Thread(this::doAction1);
    Thread action2Thread = new Thread(this::doAction2);
    Thread action3Thread = new Thread(this::doAction3);

        do{
            if (!action1list.isEmpty() && !action1Thread.isAlive()) {
                    action1Thread = new Thread(this::doAction1);
                    action1Thread.start();
                }

            if (!action2list.isEmpty() && !action2Thread.isAlive()) {
                    action2Thread = new Thread(this::doAction2);
                    action2Thread.start();
                }
            if (!action3list.isEmpty() && !action3Thread.isAlive()) {
                    action3Thread = new Thread(this::doAction3);
                    action3Thread.start();
                }
        }while( /*All lists have something and any thread is alive */)
}

    doAction1(){
        action1list.take()
        /* some things */
        action2list.put()
    }
    /* Other actions */

1 Ответ

5 голосов
/ 05 апреля 2020

Вы не можете "перезапустить" поток Java. Как только он завершился, он не может быть перезапущен.

Но это не то, что вы делаете. На самом деле вы постоянно создаете и запускаете (не перезапускаете) новые темы. Это неэффективно, потому что начало и выход потока довольно дороги. Кроме того, «основной» поток опрашивает другие потоки, чтобы определить, живы ли они, что является еще одной неэффективностью.

Там определенно - лучший способ.

Посмотрите на ExecutorService API. Это позволяет вам отправлять неопределенное количество «задач» в рабочую очередь и обрабатывать их из пула потоков. API заботится о запуске рабочих потоков, прохождении их задач и перезапуске, если они обрабатывают sh. Службы Executor могут быть созданы с пулами фиксированного размера, сжимающимися и растущими пулами, бесконечными ограниченными рабочими очередями и т. Д.

Для получения дополнительной информации; начните с javado c и Oracle учебников по этой теме c.

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