java在检查时间时侦听套接字

java在检查时间时侦听套接字,java,multithreading,Java,Multithreading,我有个问题 我的客户机需要在特定的时间段内监听服务器,如果在此时间内没有收到服务器的回复,则必须关闭连接 我在客户机中有两个线程,一个在时间到期后将布尔变量更新为false,另一个线程从服务器和计时器检查msg 我的代码是这样的: while(true){ if(l=is.readLine().equals(msg)) { // do processing break; } if(timer) break; } 所

我有个问题

我的客户机需要在特定的时间段内监听服务器,如果在此时间内没有收到服务器的回复,则必须关闭连接

我在客户机中有两个线程,一个在时间到期后将布尔变量更新为false,另一个线程从服务器和计时器检查msg

我的代码是这样的:

while(true){
    if(l=is.readLine().equals(msg))
    {
        // do processing
        break;
    }
    if(timer)
        break;
}
所以我的while循环continuoslu检查msg和timer。 问题是.readline()正在阻止调用,并且正在不确定地等待来自服务器的消息

我该怎么做呢

我试过了

if(l=is.readLine()!=null and l.equals(msg)) 

但是没有工作。

为服务器侦听器创建一个新线程。如果新线程接收到来自服务器的输入,请将其设置为内部切换


在主线程中,启动一个循环,等待连接超时或服务器线程连接。如果连接,则处理服务器的输入。如果没有,并且超时,则终止线程(并可能关闭连接)

为此,您可以使用CountdownLatch。启动网络线程,然后调用等待倒计时闩锁:

CountDownLatch latch = new CountDownLatch(1);

// start network thread
networkThread.start();

boolean wasFinished = latch.await(you_timeout);

// Interrupt network thread as it still waiting:
if(!wasFinished) {
    networkThread.interrupt();
}

读取成功后在网络线程中调用lock.countDown()

您可以检查这两种情况,但这比让线程轮询您的连接并关闭超时的连接要复杂得多

i、 e.有一个线程,它大约每秒唤醒一次,并调用连接列表中每个连接的checkTimeout()方法。如果checkTimeout检测到已达到超时,则设置
closed=truevolatile标志并关闭()连接。如果抛出异常,如果在连接关闭后发生,我将忽略它


您可以使用SocketTimeout,但这并不总是在所有平台上都像预期的那样工作。参见

在给定的情况下,我认为投票是@Peter所说的最佳选择。 但也可以使用两个线程来完成:

NetworkThread implements Runnable, Closeable{
BufferedReader r;
volatile boolean readyToClose = false;
@Override
public void run(){
//initialize r as t = new BufferedReader(new InputStreamReader(socket.getInputStream()))
String s = null;
while((s= r.readLine())!=null){
  readyToClose = true;
 //do whatever
}
}
public void close() throws IOException
{
   if(readyToClose()
     r.close();
}
}

另一个线程将在此期间被阻止(
sleep
)。然后将调用
NetworkThread#close()
。这将关闭流,另一个线程将退出循环。

谢谢大家

我找到了解决这个问题的简单方法

在调用readline之前,我正在检查缓冲区中是否有数据

if(ir.ready())
    ir.readLine()

abouve只有在其非阻塞的情况下才会调用readLine。

因此,除了侦听器和计时器之外,我还必须有另一个线程??不管怎样,我可以在同一个线程中检查这两个条件??你可以将计时器放在主线程中-只是确保它不会占用CPU。服务器连接在其自己的线程中,因此如果需要,它可以被终止。即使我的计时器在主线程中,如果我收到消息,我还需要另外两个线程来切换,并检查哪个线程满足(收到的消息或计时器过期)ryt?
readLine
由于中断而没有出现。它仍将被封锁。我认为@ashish的意思是他能够建立连接,但却在等待输入<代码>检查超时
将等待连接获得established@Jatin你可能是对的,但是这样的检查超时可以检查你需要什么。