【发布时间】:2011-03-13 19:59:08
【问题描述】:
基本上,我正在调用 BufferedReader.ReadLine();但是我在一个多线程服务器中,我正在同步树中的一个节点。因此,当调用此 ReadLine 函数时,如果其他人到达该节点,他们就会被锁定。我不知道如何对 ReadLine 在退出线程之前等待响应的时间量进行时间限制。我得到的最接近的是创建一个会休眠 1ms 的新线程,然后检查我设置 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 工作,但不能。这是我的答案吗?我将如何实现它?
[EDIT] socketIn 是一个 BufferedReader,应该明确表示抱歉。 此外,客户端通过 telnet 进行连接,但我认为这并不重要。
我在这里做的是一个“名人猜谜游戏”,用户可以在其中将名人添加到树中。所以我需要锁定这个人正在编辑的节点以保证线程安全
【问题讨论】:
-
在下面查看我的答案 - 如果您在等待输入时锁定,您将被卡住(除非您超时读取,在这种情况下您会很慢)。上面的代码更加危险,因为您正在启动一个新线程并试图让两个线程访问
answer而无需锁定(同步)。
标签: java multithreading synchronization timeout