进程,线程关闭应用程序

时间:2013-09-18 10:11:44

标签: java multithreading process

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

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

任何想法?

1 个答案:

答案 0 :(得分:0)

  

当我退出申请时我做了

     

input.setRunning(假);

     

error.setRunning(假);

     

我还在TrayIcon类上进行了处理

     

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

无需这样做。如果要关闭应用程序,即使某些线程仍在执行,也可以将它们标记为守护程序。只需在线程声明后放置这些行。

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

Thread#setDaemon(boolean)

     

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