基本上,我打电话给BufferedReader.ReadLine();然而,我正在一个多线程服务器中,在这里我正在同步树中的一个节点。所以当这个ReadLine函数被调用时,如果有其他人到达该节点,它们被锁定。我无法弄清楚如何在退出线程之前等待ReadLine等待响应的时间限制。我得到的最接近的是创建一个可以睡1ms的新线程,然后检查设置ReadLine的变量是否更改。因此,像这样:如何超时阻塞Java的函数?
synchronized (pointer) {
String answer = "";
Thread d = new Thread(new Runnable() {
public void run() {
try {
int i = 0;
while (answer.equals("")) {
if (i == 10000) {
System.out.println("Timeout Occured");
System.exit(0);
}
try {
Thread.sleep(1);
i++;
}
catch(Exception e) {
System.out.println("sleep problem occured");
}
}
}
catch (IOException ex) {
}
}
});
d.start();
answer = socketIn.readLine();
}
这做了什么,我想它,但我无法弄清楚如何停止当前线程解锁节点,以便其他用户可以继续,而不是杀死整个服务器。最后,我想也许我可以这样做:
Thread d = new Thread(new Runnable() {
public void run() {
try {
answer = socketIn.readLine();
} catch (IOException ex) {
}
}
});
d.join(10000);
catch (InterruptedException e){
socketOut.println("Timeout Occured. Returning you to the beginning...");
socketOut.flush();
return;
}
但是,这似乎仍然阻止,无法继续。有人可以帮我解决这个问题吗?我无法理解我在做什么错了?
我也尝试让ExecutorService工作,但不能。这是我的答案吗?我将如何实现它?
[编辑] socketIn是一个BufferedReader,应该说明确抱歉。 此外,客户端通过telnet连接,但我认为不重要。
我在这里做的是一个“名人猜测游戏”,用户可以将名人添加到树中。所以我需要锁定该人员正在编辑的节点以保证线程安全
请参阅下面的回答 - 如果您在等待输入时锁定,则会卡住(除非您超时读取,在这种情况下,您只是缓慢)。你上面的代码更危险,因为你正在开始一个新线程,并试图让两个线程在不锁定的情况下访问'answer'(同步)。 – 2011-03-13 20:28:42