Нужно ли вручную останавливать потоки в Java?

Когда мое приложение будет готово к выходу, либо закрыв окно, либо вызвав метод System.exit (). Должен ли я вручную останавливать созданные мной потоки, или Java позаботится об этом для меня?

10
задан rajadilipkolli 5 July 2017 в 06:07
поделиться

2 ответа

В случаях, когда вы используете System.exit (). Все потоки остановятся независимо от того, являются ли они демонами.

В противном случае JVM автоматически остановит все потоки, которые являются потоками демона, установленными Thread.setDaemon (true). Другими словами, jvm выйдет только тогда, когда оставшиеся потоки являются потоками демона или вообще не будут потоками.

Рассмотрим пример ниже, он продолжит работу даже после возврата из основного метода. но если вы установите его как демон, он завершится, когда завершится основной метод (основной поток).

public class Test {

    public static void main(String[] arg) throws Throwable {
       Thread t = new Thread() {
          public void run()   {
             while(true)   {
                try  {
                   Thread.sleep(300);
                   System.out.println("Woken up after 300ms");
                }catch(Exception e) {}
             }
          }
       };

       // t.setDaemon(true); // will make this thread daemon
       t.start();
       System.exit(0); // this will stop all threads whether are not they are daemon
       System.out.println("main method returning...");
    }
}
11
ответ дан 3 December 2019 в 23:10
поделиться

Если вы хотите, чтобы потоки останавливались перед корректным завершением, можно использовать обработчики выключения.

выглядит так:

Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() { 
    //Stop threads }
});

См .: hook-design

3
ответ дан 3 December 2019 в 23:10
поделиться