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