1

これは私のコードです:

// TODO Auto-generated method stub
        try
        {
            Socket clientSocket = new Socket("localhost", 8888);

            ObjectOutputStream ous = new ObjectOutputStream(clientSocket.getOutputStream());

            while(sending)
            {
                Statistics statsData = setStatisticsData();
                ous.writeObject(statsData);

                Thread.sleep(5000);
            }           
        }
        catch(UnknownHostException uhe) 
        {
            uhe.printStackTrace();
        }
        catch(IOException ioe)
        {
            ioe.printStackTrace();
        } 
        catch (InterruptedException e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

それはクライアントです。無限ループでオブジェクト Statistics を送信します。入力によってこの無限ループを中断する方法を実装します (つまり、キーボードのボタンを押します)。どうすれば無限ループを中断できますか?

4

3 に答える 3

4

これが別のスレッドの場合:

Thread statisticsSendingThread = ...

次に、単に中断します。

statisticsSendingThread.interrupt();

InterruptedExceptionループから抜け出してスローされます。

sendingブール値のフラグが既にあるようです。これも同様に機能しますが、最悪の場合 5 秒の遅延が発生します。また、スレッドの方法をvolatile使用してください。isInterrupted()ただし、スレッドを中断するinterrupt()のが最も簡単な方法です (追加のコーディングは必要ありません)。そして、あなたのループは真に無限になる可能性があります (while(true)とはいえwhile(!isInterrupted()))。


ところで、あなたのsetStatisticsData()名前はおそらくgetStatisticsData().

于 2012-07-11T13:10:31.230 に答える
0

別のスレッドでそれらを実行する必要があります。ユーザー入力を探しているので、コードを非同期スレッドに移動するのがおそらく最善でしょう。次に、入力時にsendingbool を false に設定するか、スレッドを中断します。YourThread.interrupt();

于 2012-07-11T13:11:26.997 に答える
-1
while(sending) 
{ 
    Statistics statsData = setStatisticsData(); 
    ous.writeObject(statsData); 
    Thread.sleep(5000);
    if(EXIT_FLAG == true)
       sending = false;
}    

EXIT_FLAG は、外部から更新できる静的変数にすることができます。この無限ループを別のスレッドで実行することもできます。スレッド間でデータを共有する方法について詳しくは、こちらをご覧ください。

于 2012-07-11T13:12:09.110 に答える