0

我有一个显示在系统托盘中的小应用程序。

从这个应用程序我启动一个命令,我运行另一个 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 类

在任务管理器中,我继续看到两个线程用于应用程序,一个用于进程

如果我删除进程,线程...应用程序正确关闭

如果我把

proc.destroy();

setRunning 后,关闭应用程序完全不起作用,TrayIcon 继续显示

任何想法?

4

1 回答 1

0

当我退出应用程序时

输入.setRunning(假);

错误.setRunning(false);

我也处理 TrayIcon 类

在任务管理器中,我继续看到两个线程用于应用程序,一个用于进程

没必要那样做。如果您想关闭您的应用程序,即使某些线程仍在执行,您可以将它们标记为守护进程。只需将这些行放在线程声明之后。

input.setDaemon(true);
error.setDaemon(true);

线程#setDaemon(布尔值)

将此线程标记为守护线程或用户线程。当唯一运行的线程都是守护线程时,Java 虚拟机退出。此方法必须在线程启动之前调用。

于 2013-09-18T10:16:41.980 回答