2009-09-08 3 views
0

Привет У меня есть автономное приложение, в котором при входе пользователя в файл abc.lck создается, когда приложение закрыто, оно удаляется. Я использовал addshutdownhook(), чтобы удалить файл при подаче питания прерывается, что отключает источник питания, когда мое приложение работает. Моя проблема заключается в том, что файл не удаляется, когда я вручную отключает систему, то есть при запуске -> выключение, и я должен пригласить пользователя с помощью сообщения изменения с помощью cofirm dailog окна как в MS Word.Can нибудь помочь мне Поблагодарив U ChaithuОбработка события завершения работы

+0

Ваше приложение работает на ноутбуке или машине с источником бесперебойного питания (ИБП)? – Will

+0

на машине без сбоев, и проблема заключается в ручном отключении – chaithu

ответ

2

Используйте deleteOnExit метод ИНСТ объявление добавления shutdownhook. Тем не менее, обратите внимание на эту sample,

class Shutdown { 

    private Thread thread = null; 
    protected boolean flag=false; 
    public Shutdown() { 
    thread = new Thread("Sample thread") { 
    public void run() { 
     while (!flag) { 
      System.out.println("Sample thread"); 
      try { 
       Thread.currentThread().sleep(1000); 
       } catch (InterruptedException ie) { 
       break; 
       } 
     } 
     System.out.println("[Sample thread] Stopped"); 
    } 
    }; 
    thread.start(); 
    } 
public void stopThread() { 
    flag=true; 
} 
} 

class ShutdownThread extends Thread { 
    private Shutdown shutdown = null; 
    public ShutdownThread(Shutdown shutdown) { 
     super(); 
     this.shutdown = shutdown; 
    } 
    public void run() { 
     System.out.println("Shutdown thread"); 
     shutdown.stopThread(); 
     System.out.println("Shutdown completed"); 
    } 
} 

public class Main { 
    public static void main(String [] args) { 
    Shutdown shutdown = new Shutdown(); 
    try { 
    Runtime.getRuntime().addShutdownHook(new ShutdownThread(shutdown)); 
    System.out.println("[Main thread] Shutdown hook added"); 
    } catch (Throwable t) { 
     System.out.println("[Main thread] Could not add Shutdown hook"); 
    } 

    try { 
     Thread.currentThread().sleep(10000); 
    } catch (InterruptedException ie) {} 
    System.exit(0); 
    } 
} 
5

Общий договор addShutdown крючок

Виртуальная машина Java выключается в ответ на два вида событий:

  • Программа как правило, при выходе последней нитевой нити или при вызове метода выхода (эквивалентно, System.exit) или

  • Th виртуальная машина завершается в ответ на прерывание пользователя, например, набирает^C или общесистемное событие, такое как выключение пользователя или выключение системы.

Отключенный крюк - это просто инициализированная, но неуправляемая нить. Когда виртуальная машина начнет свою последовательность выключения, она запустит все зарегистрированные крючки отключения в некотором неуказанном порядке и позволит им запускать одновременно. Когда все крючки закончены, он будет запускать все неинвинированные финализаторы, если финализация на выходе будет включена. Наконец, виртуальная машина остановится. Обратите внимание, что потоки демона будут продолжать работать во время последовательности выключения, так же как и потоки не-демона, если выключение было инициировано вызовом метода exit.

В редких случаях виртуальная машина может прервать работу, то есть прекратить работу, не отключаясь полностью. Это происходит, когда виртуальная машина завершается извне, например, с сигналом SIGKILL в Unix или вызовом TerminateProcess в Microsoft Windows. Кроме того, виртуальная машина может прервать работу, если родной метод пойдет наперекосяк, например, повреждая внутренние структуры данных или пытаясь получить доступ к несуществующей памяти. Если виртуальная машина прерывается, то не может быть гарантирована, будут ли выполняться какие-либо выключения.

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

+0

+1 большое объяснение по последовательности отключения JVM. –

+0

Видимо, это то, что происходит, когда вы завершаетесь от затмения, потому что крюк вообще не называется! –

Смежные вопросы