【发布时间】:2017-12-21 10:28:02
【问题描述】:
我的标题可能不是最具描述性的,但我会尝试展示尽可能多的代码,希望它能帮助大家更好地理解我的问题。这是我的项目的客户端如何查询服务器以获取信息。这是一个典型请求的示例:
private String GENERATEGROUPKEY()
{
/* `out` is a PrintWriter using the sockets output stream */
out.println("GENERATEGROUPKEY");
try
{
/* `in` is a BufferedReader using the sockets input stream */
String response = in.readLine();
String[] temp = response.split(" ");
return temp[1];
}
catch (IOException ex)
{
return null; // throw connection error to client
}
}
我的问题是,在任何时候,服务器都可以通过同一个套接字向客户端发送一条未经请求的消息,其中包含信息(就像聊天客户端接收消息一样)。我不成功的想法是创建一个线程来监听这样的消息,只要我们不在另一个查询的中间,但这也是不成功的,因为即使我打断了那个线程,它仍然会占用应该'已经转到客户端查询。
private String GENERATEGROUPKEY()
{
out.println("GENERATEGROUPKEY");
listenThread.interrupt(); // block listenThread from recieving response
try
{
String response = in.readLine();
String[] temp = response.split(" ");
listenThread = new PulseThread(in); // we're done, so allow
listenThread.start();
return temp[1];
}
catch (IOException ex)
{
listenThread = new PulseThread(in); // we're done, so allow
listenThread.start();
return null; // throw connection error to client
}
}
这正是listenThread 的含义
public class PulseThread extends Thread
{
private BufferedReader in;
public PulseThread(BufferedReader in)
{
this.in = in;
}
@Override
public void run()
{
while (true)
{
if (Thread.currentThread().isInterrupted())
{
break;
}
try
{
String line = in.readLine();
System.out.println(line);
String[] params = line.split(" ");
if (params[0].equals("PULSED"))
{
NotificationManager.sendNotification("You have been pulsed!", "Pulsed by: " + params[1]);
}
}
catch (Exception ex)
{
}
}
}
}
我之前的印象是,在BufferedReader 的阻塞调用中间用readLine() 中断线程只会取消阻塞调用,除非我做错了其他事情。
任何帮助将不胜感激,谢谢。
编辑:因此,在这句话上方的几行中查看我的假设,似乎中断线程不会取消readLine()。我想中断线程的想法是不行的。这样做的正确方法是什么?
【问题讨论】:
-
与,错误,multithreading?哪里说中断线程会取消它被阻塞的 I/O 操作?
-
@EJP 这不是多线程问题吗?不确定合法和独特问题上的 -1 是否合适,但我离题了。 Javadocs 说,我引用,“如果该线程在可中断通道上的 I/O 操作中被阻塞,则该通道将被关闭。”这不适用于我吗?如果不是,我可能的解决方案是什么,因为我不知道我需要做什么。
-
@Headline 实际引用说 InterruptibleChannel 就像在 java 类中一样。 BufferedReader 可能会抛出异常,但由于您没有对它做任何事情,所以您不会知道。
-
另外,如果你正在使用一个通道,并且你中断了正在读取它的线程并且它关闭了那个通道......没有其他东西可以从那个通道读取。
标签: java multithreading sockets