gpt4 book ai didi

java - 在执行jar之后,什么使Java进程保持 Activity 状态?

转载 作者:行者123 更新时间:2023-12-04 10:45:12 25 4
gpt4 key购买 nike

我有一个从Windows命令提示符下执行的Java jar文件。代码正常完成(即完成了预期的工作),但Java进程继续运行。该应用程序是单线程的。我需要在代码完成后按Ctrl-c来停止该过程,以重新获得命令提示符。

我假设可以在主方法的末尾放置System.exit(0),大概可以解决此问题,但是我的印象是没有必要。在什么情况下,java进程在执行结束时保持活动状态?这是我主要方法的外壳:

public static void main(String[] args) {
try {
//application code here
Logger.log("Now finished");
} catch (SomeExceptoin e) {
Logger.error("Some error occured");
}
}


记录器是我自己难以置信的基本静态类,它仅将消息转储到 System.out.println()。控制台中将显示“ Now finish”,但该过程将继续运行。有任何想法吗?

编辑:根据要求,这是所有功能的记录器代码(我确实警告过您:)

public class Logger {
public static void logInfo(String logMessage)
{
System.out.println(timestamp() + logMessage);
}
private static String timestamp()
{
SimpleDateFormat formatter = new SimpleDateFormat("yyyy.MM.dd hh:mm:ss");
String timestamp = "[" + formatter.format(new Date()) + "] ";
return timestamp;
}
}


编辑编辑:我在instanceofTom的答案中使用了链接中的线程转储代码,在上面的try中放置了finally块。这是输出:

...
[2010.11.18 11:22:57]输出完成。至此所有处理结束。



线程名称:参考处理程序
java.lang.Object.wait(本机方法)
java.lang.Object.wait(Object.java:485)
java.lang.ref.Reference $ ReferenceHandler.run(Reference.java:116)



线程名称:终结器
java.lang.Object.wait(本机方法)
java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116)
java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132)
java.lang.ref.Finalizer $ FinalizerThread.run(Finalizer.java:159)



线程名称:Signal Dispatcher



线程名称:附加侦听器



线程名称:Java2D Disposer
java.lang.Object.wait(本机方法)
java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116)
java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132)
sun.java2d.Disposer.run(Disposer.java:125)
java.lang.Thread.run(Thread.java:619)



线程名称:main
java.lang.Thread.getStackTrace(Thread.java:1436)
com.my.code.WorkloadManager.visit(WorkloadManager.java:124)
com.my.code.WorkloadManager.visit(WorkloadManager.java:138)
com.my.code.WorkloadManager.main(WorkloadManager.java:71)
sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:56)



线程名称:com.google.inject.internal.Finalizer
java.lang.Object.wait(本机方法)
java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116)
java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132)
com.google.inject.internal.Finalizer.run(Finalizer.java:114)



线程名称:AWT-Windows
sun.awt.windows.WToolkit.eventLoop(本机方法)
sun.awt.windows.WToolkit.run(WToolkit.java:291)
java.lang.Thread.run(Thread.java:619)



线程名称:EventQueueMonitor-ComponentEvtDispatch
java.lang.Object.wait(本机方法)
java.lang.Object.wait(Object.java:485)
com.sun.java.accessibility.util.ComponentEvtDispatchThread.run(EventQueueMonitor.java:616)****************
线程名称:参考处理程序
java.lang.Object.wait(本机方法)
java.lang.Object.wait(Object.java:485)
java.lang.ref.Reference $ ReferenceHandler.run(Reference.java:116)



线程名称:终结器
java.lang.Object.wait(本机方法)
java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116)
java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132)
java.lang.ref.Finalizer $ FinalizerThread.run(Finalizer.java:159)



线程名称:Signal Dispatcher



线程名称:附加侦听器



线程名称:Java2D Disposer
java.lang.Object.wait(本机方法)
java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116)
java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132)
sun.java2d.Disposer.run(Disposer.java:125)
java.lang.Thread.run(Thread.java:619)



线程名称:main
java.lang.Thread.getStackTrace(Thread.java:1436)
com.my.code.WorkloadManager.visit(WorkloadManager.java:124)
com.my.code.WorkloadManager.visit(WorkloadManager.java:138)
com.my.code.WorkloadManager.main(WorkloadManager.java:71)
sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:56)



线程名称:com.google.inject.internal.Finalizer
java.lang.Object.wait(本机方法)
java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116)
java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132)
com.google.inject.internal.Finalizer.run(Finalizer.java:114)



线程名称:AWT-Windows
sun.awt.windows.WToolkit.eventLoop(本机方法)
sun.awt.windows.WToolkit.run(WToolkit.java:291)
java.lang.Thread.run(Thread.java:619)



线程名称:EventQueueMonitor-ComponentEvtDispatch
java.lang.Object.wait(本机方法)
java.lang.Object.wait(Object.java:485)
com.sun.java.accessibility.util.ComponentEvtDispatchThread.run(EventQueueMonitor.java:616)

最佳答案

具有UI的Java应用程序启动不是“守护程序”线程的事件处理线程。也就是说,只要这些线程正在运行,程序就不会终止,即使当前没有显示任何窗口。

菜单上是否有“退出”命令?它的Action应该调用System.exit(0)

关于java - 在执行jar之后,什么使Java进程保持 Activity 状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4220185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com