我有一个小应用程序显示在系统托盘中。
从这个应用程序我启动一个命令,我运行另一个java程序,我得到它inputStream并在textArea中显示它。
final Process process = Runtime.getRuntime().exec( runCommand );
input = new LoggingThread( process.getInputStream() );
error = new LoggingThread( process.getErrorStream() );
input.start();
error.start();
In loggingThread
public void run()
{
while ( running )
{
try
{
BufferedReader reader = new BufferedReader( new InputStreamReader( inputStream ) );
String line = "";
try
{
while ( ( line = reader.readLine() ) != null && running )
{
JTextAreaAppender.getTextArea().append( line );
JTextAreaAppender.getTextArea().append( System.getProperty( "line.separator" ) );
}
}
finally
{
reader.close();
}
}
catch ( IOException ioe )
{
ioe.printStackTrace();
}
}
}
当我退出申请时我做了
input.setRunning(false);
error.setRunning(false);
我还在TrayIcon类上进行了处理
在任务管理器中,我继续看到应用程序的两个线程,一个用于Process
如果我删除进程,则...应用程序正在正确关闭
如果我把
proc.destroy();
在setRunning之后,关闭应用程序根本不起作用,TrayIcon继续显示
任何想法?
答案 0 :(得分:0)
当我退出申请时我做了
input.setRunning(假);
error.setRunning(假);
我还在TrayIcon类上进行了处理
在任务管理器中,我继续看到应用程序的两个线程,一个用于Process
无需这样做。如果要关闭应用程序,即使某些线程仍在执行,也可以将它们标记为守护程序。只需在线程声明后放置这些行。
input.setDaemon(true);
error.setDaemon(true);
将此线程标记为守护程序线程或用户线程。当运行的唯一线程都是守护程序线程时,Java虚拟机将退出。 必须在线程启动之前调用此方法。