Linguaggio

Runtime.AddShutdownHook(Thread) Metodo

Definizione

Registra un nuovo hook di arresto della macchina virtuale.

[Android.Runtime.Register("addShutdownHook", "(Ljava/lang/Thread;)V", "GetAddShutdownHook_Ljava_lang_Thread_Handler")]
public virtual void AddShutdownHook(Java.Lang.Thread? hook);
[<Android.Runtime.Register("addShutdownHook", "(Ljava/lang/Thread;)V", "GetAddShutdownHook_Ljava_lang_Thread_Handler")>]
abstract member AddShutdownHook : Java.Lang.Thread -> unit
override this.AddShutdownHook : Java.Lang.Thread -> unit

Parametri

hook
Thread

Oggetto inizializzato ma non Thread inizializzato

Attributi

Eccezioni

se l'hook è già stato avviato o se è già stato registrato.

se la macchina virtuale sta già arrestando.

Commenti

Registra un nuovo hook di arresto della macchina virtuale.

La macchina virtuale Java si arresta in risposta a due tipi di eventi:

<ul>

<li> Il programma viene chiuso normalmente, quando l'ultimo thread non daemon viene chiuso o quando viene richiamato il #exit exit metodo (equivalentemente , System#exit(int) System.exit) o

<li> La macchina virtuale viene terminata in risposta a un interrupt dell'utente, ad esempio digitando ^Co un evento a livello di sistema, ad esempio l'accesso utente o l'arresto del sistema.

</ul>

Un hook di arresto è semplicemente un thread inizializzato ma non inizializzato. Quando la macchina virtuale avvia la sequenza di arresto, avvia tutti gli hook di arresto registrati in un ordine non specificato e lascia che vengano eseguiti simultaneamente. Quando tutti gli hook sono finiti, si interromperà. Si noti che i thread daemon continueranno a essere eseguiti durante la sequenza di arresto, in quanto i thread non daemon se l'arresto è stato avviato richiamando il #exit exit metodo .

Una volta avviata la sequenza di arresto, può essere arrestata solo richiamando il #halt halt metodo , che termina forzatamente la macchina virtuale.

Una volta iniziata la sequenza di arresto, non è possibile registrare un nuovo hook di arresto o registrare un hook registrato in precedenza. Se si tenta di eseguire una di queste operazioni, verrà generata un'eccezione IllegalStateException .

Gli hook di arresto vengono eseguiti in un momento delicato nel ciclo di vita di una macchina virtuale e devono quindi essere codificati in modo difensivo. Devono, in particolare, essere scritti per essere thread-safe e per evitare i deadlock nel modo più possibile. Non devono inoltre basarsi in modo cieco sui servizi che potrebbero aver registrato i propri hook di arresto e pertanto possono essere in corso di arresto. I tentativi di usare altri servizi basati su thread, ad esempio il thread AWT event-dispatch, possono causare deadlock.

Anche gli hook di arresto dovrebbero terminare rapidamente il loro lavoro. Quando un programma richiama #exit exit l'aspettativa è che la macchina virtuale verrà arrestata e chiusa tempestivamente. Quando la macchina virtuale viene terminata a causa della disconnessione dell'utente o dell'arresto del sistema, il sistema operativo sottostante può consentire solo un periodo di tempo fisso in cui arrestare e uscire. È pertanto sconsigliabile tentare qualsiasi interazione dell'utente o di eseguire un calcolo a esecuzione prolungata in un hook di arresto.

Le eccezioni non rilevate vengono gestite negli hook di arresto esattamente come in qualsiasi altro thread, richiamando il ThreadGroup#uncaughtException uncaughtException metodo dell'oggetto del ThreadGroup thread. L'implementazione predefinita di questo metodo stampa l'analisi System#err dello stack dell'eccezione in e termina il thread, ma non causa l'uscita o l'interruzione della macchina virtuale.

In rari casi la macchina virtuale può interrompere, ovvero arrestare l'esecuzione senza arrestarla correttamente. Ciò si verifica quando la macchina virtuale viene terminata esternamente, ad esempio con il SIGKILL segnale su Unix o la TerminateProcess chiamata in Microsoft Windows. La macchina virtuale può anche interrompere se un metodo nativo passa awry by, ad esempio danneggiare le strutture di dati interne o tentare di accedere alla memoria inesistente. Se la macchina virtuale interrompe, non è possibile garantire se verranno eseguiti o meno hook di arresto.

Aggiunta nella versione 1.3.

per java.lang.Runtime.addShutdownHook(java.lang.Thread).

Le parti di questa pagina sono modifiche basate sul lavoro creato e condiviso dalla e usati in base ai termini descritti in Creative License 2.5 Attribution License.

Si applica a