Java 如何打破无限循环

Java 如何打破无限循环,java,while-loop,Java,While Loop,这是我的一段代码: // TODO Auto-generated method stub try { Socket clientSocket = new Socket("localhost", 8888); ObjectOutputStream ous = new ObjectOutputStream(clientSocket.getOutputStream()); while(sendi

这是我的一段代码:

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

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

如果这是一个单独的线程:

Thread statisticsSendingThread = ...
然后简单地打断它:

statisticsSendingThread.interrupt();
InterruptedException
将被抛出,从循环中转义

我看到您已经有一个布尔
发送
标志。它也可以工作,但在最坏的情况下会有5秒的延迟。另外,请确保它是易失性的——或者更好,使用
isInterrupted()
线程方法。但是使用
interrupt()
中断线程是目前为止最简单的方法(不需要额外的编码)。您的循环可以是真正无限的(
while(true)
尽管使用
while(!isInterrupted())



顺便说一句,您的
setStatisticsData()
可能应该命名为
getStatisticsData()
,您必须在单独的线程上执行这些操作,并且由于您正在寻找用户输入,因此最好将代码移动到某个异步线程,然后只需在输入时将
发送的
bool设置为false或中断线程
YourThread.interrupt()


EXIT_标志可以是可以从外部更新的静态变量。您可能还希望在单独的线程中运行这个无限循环。阅读有关如何在线程之间共享数据的更多信息。

if(EXIT_标志)中断?为什么用大写字母来命名变量?不过,这不是我的反对票。“你可能还想在一个单独的线程中运行这个无限循环。”如果不在单独的线程中,如何设置EXIT_标志?@TomaszNurkiewicz-以提高可读性。为什么一年中的日历日是大写的?我不知道为什么投了反对票。但是,中断线程并不是解决这个问题的方法。必须有一个干净的方法来走出循环。@NominSim-“您可能还想”含蓄地说“您想”。这只是一种表达方式。不要挑剔,但“你可能也想”意味着你要么能,要么不能,但要得到OP想要的结果,实际上是“你必须”,如果他想要结果,就别无选择。使用
中断()
的另一个好处是它会中断
睡眠
wait
和其他各种更高级别的阻塞调用。你不能用“我们被杀了吗”的习惯来达到这个目的flag@TomaszNurkiewicz但是我应该在哪里中断线程?@user1508419-在任何线程中,从键盘读取击键事件或字符。您仍然应该使用.isInterrupted()作为循环条件。如果你在写对象()方法的中间,线程中断不会做任何事情,除了设置当前线程上的中断标志。这通常适用于所有阻塞io(java.io包中的任何内容)。只有像Thread.sleep()这样的特定方法才会响应中断并抛出异常。
while(sending) 
{ 
    Statistics statsData = setStatisticsData(); 
    ous.writeObject(statsData); 
    Thread.sleep(5000);
    if(EXIT_FLAG == true)
       sending = false;
}