Почему мой поток не создает новый, когда обнаруживает исключение? - PullRequest
0 голосов
/ 12 июля 2020

Итак, у меня есть поток, работающий следующим образом:

Runnable runnable = new Runnable() {
                        @Override
                        public void run() {
                            System.out.println("redo groupMonitor ... ");
                            if (redogmSafer < 1) {
                                groupMonitor.run(remoteHost, port);
                            } else {
                            }
                            redogmSafer = 100;
                        }
                    };
ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
service.scheduleAtFixedRate(runnable, 0, delayStart, TimeUnit.MILLISECONDS);

if (redogmSafer < 1) {
} else {
    service.shutdown();
    service.shutdownNow();
    redogmSafer = 0;
}

И я хочу снова run() Thread, после того, как он завершился из-за исключения или еще (случается все 4-5 Часы).

Я пробовал shutdown() и shutdownNow(), но это тоже не помогло. Как будто Java не хочет переделывать потоки после того, как он был запущен, запущен и завершен ...

Ответы [ 2 ]

0 голосов
/ 12 июля 2020

Оберните свой код Runnable / Callable с помощью try-catch

A ScheduledExecutorService останавливает дальнейшее планирование при получении Throwable (Exception или Error). Эта остановка происходит без уведомления, без сообщений об ошибках, без сообщений или регистрации. Предотвращение заключается в том, чтобы обернуть ваш код Runnable / Callable с помощью try-catch.

Пока не Throwable всплытие стека вызовов достигает запланированной службы исполнителя, планирование продолжается.

Runnable runnable = new Runnable() {
                        @Override
                        public void run() {
                            try{
                                System.out.println("redo groupMonitor ... ");
                                if (redogmSafer < 1) {
                                    groupMonitor.run(remoteHost, port);
                                } else { 
                                    …
                                }
                                redogmSafer = 100;
                            } catch ( Exception e ) { … }
                        }
                    };

Перехватываете ли вы Throwable, Exception или другие c исключения, решать вам и вашей команде в соответствии с вашей ситуацией.

Этот topi c уже неоднократно рассматривался в Stack Overflow. Найдите, чтобы узнать больше. В частности, см. ScheduledExecutorService Обработка исключений .

0 голосов
/ 12 июля 2020

Вы можете создать новый поток следующим образом:

Thread newThread = new Thread(runnable);

newThread.start();

или использовать ExecutorService:

ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(runnable);

Но вы уже используете ScheduledExecutorService, который должен выполнять эту работу.

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