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クラスでも破棄します

タスク マネージャーでは、アプリケーション用の 2 つのスレッドとプロセス用の 1 つのスレッドが引き続き表示されます。

プロセス、スレッドを削除すると...アプリケーションが正しく閉じられます

私が入れたら

proc.destroy();

setRunning の後、アプリケーションを閉じてもまったく機能せず、TrayIcon が表示され続ける

何か案が?

4

1 に答える 1

0

アプリケーションを終了するとき

input.setRunning(false);

error.setRunning(false);

私はTrayIconクラスでも破棄します

タスク マネージャーでは、アプリケーション用の 2 つのスレッドとプロセス用の 1 つのスレッドが引き続き表示されます。

その必要はありません。一部のスレッドがまだ実行中の場合でもアプリケーションを閉じたい場合は、それらをデーモンとしてマークできます。これらの行をスレッド宣言の後に配置するだけです。

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

Thread#setDaemon(boolean)

このスレッドをデーモン スレッドまたはユーザー スレッドとしてマークします。実行中のスレッドがすべてデーモン スレッドのみの場合、Java 仮想マシンは終了します。このメソッドは、スレッドが開始される前に呼び出す必要があります。

于 2013-09-18T10:16:41.980 に答える