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();
        }

它是客户端。它将无限循环发送对象统计信息。我将实现一种通过输入来打破这个无限循环的方法(例如,按下键盘上的一个按钮)。我能做什么?我怎样才能打破无限循环?

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 回答