如果动作长时间冻结,如何打破循环

How to break a loop if action freezes for a long time

实际上,我正在写 Java(如果这很重要并且 java 有解决我的问题的具体方法,老实说,我不知道)一个 IRC 协议客户端,知识有点欠缺。我有一行我从 IRC 服务器读取行。那一行是:

行=reader.readLine();

它工作正常,我在循环中使用这一行,但如果服务器不发送任何内容,应用程序会在这一行冻结。我的问题是,如果服务器在 10 秒内未发送任何内容,我如何能够打破循环?

我试过这样做

do {
    start = System.currentTimeMillis();
    line = reader.readLine();
    ... //doing other actions
    } while ((System.currentTimeMillis() - start) < 10*1000);

只有当我从服务器收到下一个响应时它才有效...我无法在等待 10 秒后中断循环,如果服务器不发送任何内容,我的方法将永远等待。这是我的问题,抱歉,如果有太多错误或无用的文字,这是我的第一个问题:)

只需使用Java的多线程特性。

您的应用程序的等待和读取过程应由您必须显式创建的不同线程执行。
另一个线程应该处理应用程序 UI.

这样等待和读取过程就不会再卡死应用了。

Thread class 是一个好的开始。
例如,您可以创建并启动一个线程:

Thread thread = new Thread(){
    public void run() {
        do {
            start = System.currentTimeMillis();
            line = reader.readLine();
            ... //doing other actions
            } while ((System.currentTimeMillis() - start) < 10*1000);
    };
};
thread.start();

评论后编辑。

您可以按照 StinePike 的建议使用 setSoTimeout(),但这还不够,因为您应该将超时重置为 0(这意味着无限)或操作需要时您希望的任何值超时已终止。
否则超时也将适用于其他不需要此限制超时的读数。

do {
    start = System.currentTimeMillis();
    // you set the timeout for reading to 10 second for each reading
    socket.setSoTimeout(10*1000);
    try{
      line = reader.readLine();
      ... //doing other actions 
      }
    catch (SocketException e){
        // processing if the timeout occurs and break
        break;
    } 
 } while ((System.currentTimeMillis() - start) < 10*1000);

 // you reinit the timeout for reading to infinite or any value desirable for you
 socket.setSoTimeout(0); 

使用Socket.setSoTimeOut。你可以在超时后得到一个SocketTimeoutException