Что может быть причиной этой Java необученной ошибки - PullRequest
3 голосов
/ 15 января 2020

У меня многопоточная Java программа. Основной поток выполняет следующий код во втором потоке, после чего второй поток заканчивается.

try{
   System.out.println(1); //prints
   doSomething();
   System.out.println(2); //doesn't print
} catch(Throwable t) {
   System.out.println(3); //doesn't print
}

Я запускаю этот код и, в редких случаях, вижу 1 go для консоли, и 2 или 3 отсутствуют. Похоже, что doSomething выдает какую-то ошибку, чтобы остановить поток. Это происходит примерно в 0,5% случаев. Поскольку это не Throwable, что приводит к завершению потока, что может происходить?

Основной поток продолжает успешно продолжать работу после остановки второго потока.

Это код Я использую создать и запустить второй поток.

Runnable secondThread = new Runnable() { ... }
ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) Executors.newFixedThreadPool(1);
threadPoolExecutor.execute(secondThread);

РЕДАКТИРОВАТЬ: doSomething является вызовом REST API внешнего веб-сайта.

Ответы [ 2 ]

2 голосов
/ 15 января 2020

Похоже, что doSomething не заканчивается. Поскольку вы вызываете внешнюю службу, она, вероятно, зависает. Выполните следующие действия: позвоните jps . Он находится в том же каталоге, где находится java. Это дает вам список всех java процессов. Затем вызовите jstack идентификатор процесса

0 голосов
/ 15 января 2020

Единственный ответ на ваш вопрос заключается в том, что другой поток печатает в System.out между вашей первой распечаткой и вашей второй.

Чтобы исправить это, вы должны использовать блокировку.

static Object lock = ...; //everyone who's printing to System.out should synchronize on this before printing to System.out

synchronized (lock) {
  try{
     System.out.println(1); //prints
     doSomething();
     System.out.println(2); //doesn't print
  } catch(Throwable t) {
     System.out.println(3); //doesn't print
  }
}
...