📄 runtime.java
字号:
/* * @(#)Runtime.java 1.65 06/10/10 * * Copyright 1990-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version * 2 only, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License version 2 for more details (a copy is * included at /legal/license.txt). * * You should have received a copy of the GNU General Public License * version 2 along with this work; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa * Clara, CA 95054 or visit www.sun.com if you need additional * information or have any questions. * */package java.lang;import java.io.*;import java.util.StringTokenizer;/** * Every Java application has a single instance of class * <code>Runtime</code> that allows the application to interface with * the environment in which the application is running. The current * runtime can be obtained from the <code>getRuntime</code> method. * <p> * An application cannot create its own instance of this class. * * @author unascribed * @version 1.57, 05/03/00 * @see java.lang.Runtime#getRuntime() * @since JDK1.0 */public class Runtime { private static Runtime currentRuntime = new Runtime(); /** * Returns the runtime object associated with the current Java application. * Most of the methods of class <code>Runtime</code> are instance * methods and must be invoked with respect to the current runtime object. * * @return the <code>Runtime</code> object associated with the current * Java application. */ public static Runtime getRuntime() { return currentRuntime; } /** Don't let anyone else instantiate this class */ private Runtime() {} /** * Terminates the currently running Java virtual machine by initiating its * shutdown sequence. This method never returns normally. The argument * serves as a status code; by convention, a nonzero status code indicates * abnormal termination. * * <p> The virtual machine's shutdown sequence consists of two phases. In * the first phase all registered {@link #addShutdownHook shutdown hooks}, * if any, are started in some unspecified order and allowed to run * concurrently until they finish. In the second phase all uninvoked * finalizers are run if finalization-on-exit * has been enabled. Once this is done the virtual machine {@link #halt * halts}. * * <p> If this method is invoked after the virtual machine has begun its * shutdown sequence then if shutdown hooks are being run this method will * block indefinitely. If shutdown hooks have already been run and on-exit * finalization has been enabled then this method halts the virtual machine * with the given status code if the status is nonzero; otherwise, it * blocks indefinitely. * * <p> The <tt>{@link System#exit(int) System.exit}</tt> method is the * conventional and convenient means of invoking this method. <p> * * If process model exists, Runtime.exit() must rely on the process * exiting to release resources. * <p> * If process model does not exist, and a security manager exists, * the security manager by default must prohibit calls to Runtime.exit() * by throwing SecurityException. Otherwise, the system will hang * indefinitely when called. * <p> * @param status * Termination status. By convention, a nonzero status code * indicates abnormal termination. * * @throws SecurityException * If a security manager is present and its <tt>{@link * SecurityManager#checkExit checkExit}</tt> method does not permit * exiting with the specified status * * @see java.lang.SecurityException * @see java.lang.SecurityManager#checkExit(int) * @see #addShutdownHook * @see #removeShutdownHook * @see #halt(int) */ public void exit(int status) { SecurityManager security = System.getSecurityManager(); if (security != null) { security.checkExit(status); } if (!safeExit(status)) { Shutdown.exit(status); } } private static native boolean safeExit(int status); /** * Registers a new virtual-machine shutdown hook. * * <p> The Java virtual machine <i>shuts down</i> in response to two kinds * of events: * * <ul> * * <p> <li> The program <i>exits</i> normally, when the last non-daemon * thread exits or when the <tt>{@link #exit exit}</tt> (equivalently, * <tt>{@link System#exit(int) System.exit}</tt>) method is invoked, or * * <p> <li> The virtual machine is <i>terminated</i> in response to a * user interrupt, such as typing <tt>^C</tt>, or a system-wide event, * such as user logoff or system shutdown. * * </ul> * * <p> A <i>shutdown hook</i> is simply an initialized but unstarted * thread. When the virtual machine begins its shutdown sequence it will * start all registered shutdown hooks in some unspecified order and let * them run concurrently. When all the hooks have finished it will then * run all uninvoked finalizers if finalization-on-exit has been enabled. * Finally, the virtual machine will halt. Note that daemon threads will * continue to run during the shutdown sequence, as will non-daemon threads * if shutdown was initiated by invoking the <tt>{@link #exit exit}</tt> * method. * * <p> Once the shutdown sequence has begun it can be stopped only by * invoking the <tt>{@link #halt halt}</tt> method, which forcibly * terminates the virtual machine. * * <p> Once the shutdown sequence has begun it is impossible to register a * new shutdown hook or de-register a previously-registered hook. * Attempting either of these operations will cause an * <tt>{@link IllegalStateException}</tt> to be thrown. * * <p> Shutdown hooks run at a delicate time in the life cycle of a virtual * machine and should therefore be coded defensively. They should, in * particular, be written to be thread-safe and to avoid deadlocks insofar * as possible. They should also not rely blindly upon services that may * have registered their own shutdown hooks and therefore may themselves in * the process of shutting down. * * <p> Shutdown hooks should also finish their work quickly. When a * program invokes <tt>{@link #exit exit}</tt> the expectation is * that the virtual machine will promptly shut down and exit. When the * virtual machine is terminated due to user logoff or system shutdown the * underlying operating system may only allow a fixed amount of time in * which to shut down and exit. It is therefore inadvisable to attempt any * user interaction or to perform a long-running computation in a shutdown * hook. * * <p> Uncaught exceptions are handled in shutdown hooks just as in any * other thread, by invoking the <tt>{@link ThreadGroup#uncaughtException * uncaughtException}</tt> method of the thread's <tt>{@link * ThreadGroup}</tt> object. The default implementation of this method * prints the exception's stack trace to <tt>{@link System#err}</tt> and * terminates the thread; it does not cause the virtual machine to exit or * halt. * * <p> In rare circumstances the virtual machine may <i>abort</i>, that is, * stop running without shutting down cleanly. This occurs when the * virtual machine is terminated externally, for example with the * <tt>SIGKILL</tt> signal on Unix or the <tt>TerminateProcess</tt> call on * Microsoft Windows. The virtual machine may also abort if a native method goes awry * by, for example, corrupting internal data structures or attempting to * access nonexistent memory. If the virtual machine aborts then no * guarantee can be made about whether or not any shutdown hooks will be * run. <p> * * @param hook * An initialized but unstarted <tt>{@link Thread}</tt> object * * @throws IllegalArgumentException * If the specified hook has already been registered, * or if it can be determined that the hook is already running or * has already been run * * @throws IllegalStateException * If the virtual machine is already in the process * of shutting down * * @throws SecurityException * If a security manager is present and it denies * <tt>{@link RuntimePermission}("shutdownHooks")</tt> * * @see #removeShutdownHook * @see #halt(int) * @see #exit(int) * @since 1.3 */ public void addShutdownHook(Thread hook) { SecurityManager sm = System.getSecurityManager(); if (sm != null) { sm.checkPermission(new RuntimePermission("shutdownHooks")); } Shutdown.add(hook); } /** * De-registers a previously-registered virtual-machine shutdown hook. <p> * * @param hook the hook to remove * @return <tt>true</tt> if the specified hook had previously been * registered and was successfully de-registered, <tt>false</tt> * otherwise. * * @throws IllegalStateException * If the virtual machine is already in the process of shutting * down * * @throws SecurityException * If a security manager is present and it denies * <tt>{@link RuntimePermission}("shutdownHooks")</tt> * * @see #addShutdownHook * @see #exit(int) * @since 1.3 */ public boolean removeShutdownHook(Thread hook) { SecurityManager sm = System.getSecurityManager(); if (sm != null) { sm.checkPermission(new RuntimePermission("shutdownHooks")); } return Shutdown.remove(hook); } /** * Forcibly terminates the currently running Java virtual machine. This * method never returns normally. * * <p> This method should be used with extreme caution. Unlike the * <tt>{@link #exit exit}</tt> method, this method does not cause shutdown * hooks to be started and does not run uninvoked finalizers if * finalization-on-exit has been enabled. If the shutdown sequence has * already been initiated then this method does not wait for any running * shutdown hooks or finalizers to finish their work. <p> * * If process model exists, Runtime.halt() must rely on the process * exiting to release resources. * <p> * If process model does not exist, and a security manager exists, * the security manager by default must prohibit calls to Runtime.halt() * by throwing SecurityException. Otherwise, the system will hang * indefinitely when called. * <p> * * @param status * Termination status. By convention, a nonzero status code * indicates abnormal termination. If the <tt>{@link Runtime#exit * exit}</tt> (equivalently, <tt>{@link System#exit(int) * System.exit}</tt>) method has already been invoked then this * status code will override the status code passed to that method. * * @throws SecurityException * If a security manager is present and its <tt>{@link * SecurityManager#checkExit checkExit}</tt> method does not permit * an exit with the specified status * * @see #exit * @see #addShutdownHook * @see #removeShutdownHook * @since 1.3 */ public void halt(int status) { SecurityManager sm = System.getSecurityManager(); if (sm != null) { sm.checkExit(status); } Shutdown.halt(status); } /** * Enable or disable finalization on exit; doing so specifies that the * finalizers of all objects that have finalizers that have not yet been * automatically invoked are to be run before the Java runtime exits. * By default, finalization on exit is disabled. * * <p>If there is a security manager, * its <code>checkExit</code> method is first called * with 0 as its argument to ensure the exit is allowed. * This could result in a SecurityException. * * param value true to enable finalization on exit, false to disable * deprecated This method is inherently unsafe. It may result in * finalizers being called on live objects while other threads are * concurrently manipulating those objects, resulting in erratic * behavior or deadlock.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -