Нужно ли вручную останавливать потоки в Java? - PullRequest
10 голосов
/ 21 августа 2010

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

Ответы [ 2 ]

11 голосов
/ 21 августа 2010

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

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

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

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...");
    }
}
3 голосов
/ 21 августа 2010

Если вы хотите остановить потоки перед изящным выходом, возможно, вам подойдут Shutdown Hooks.

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

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

См .: крючок

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