基本上,我在调用BufferedReader.ReadLine()方法;但是我在一个多线程服务器中,其中我正在同步树中的节点。所以当调用这个ReadLine函数时,如果有人到达该节点,他们将被锁定。我无法想出如何在线程退出之前对ReadLine等待响应的时间限制。我最接近的做法是创建一个新线程,让它休眠1毫秒,然后检查我设置ReadLine变量是否已更改。所以代码大致如下:
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连接,虽然我认为这并不重要。
我在这里做的是“名人猜测游戏”,用户可以将名人添加到树中。所以我需要锁定正在编辑的节点以进行线程安全。