我正在尝试创建一个连续的线程,服务器接收/发送来自客户端的消息但是当我尝试检查下一个元素时它会被卡住:
public void run()
{
try
{
try
{
ArrayList<Socket> connections = parent.getConnections();
in = new Scanner(socket.getInputStream());
while(true)
{
if(in.hasNextLine()) // Gets stuck here
{
String message = in.nextLine();
System.out.println("Client said " + message);
}
}
}
finally
{
socket.close();
}
}
catch(Exception e)
{
e.printStackTrace();
}
如何让循环不会卡在指定点
答案 0 :(得分:1)
假设你想要处理'线',我可能会从这样的事情开始:
public class SocketReader implements Runnable {
private final InputStream stream;
private final Queue<String> destination;
private volatile boolean active = true;
private SocketReader(InputStream stream, Queue<String> destination) {
this.stream = stream;
this.destination = destination;
}
public static SocketReader getReader(Socket toRead, Queue<String> destination) throws IOException {
return new SocketReader(toRead.getInputStream(), destination);
}
public void shutdown() {
active = false;
}
public void run() {
while(active) {
if (stream.hasNextLine() && active) {
final String line = stream.nextLine;
destination.add(line);
}
}
try {
stream.close();
} catch (IOException e) {
// Log somewhere
}
}
}
将其放入自己的线程中(或者作为线程或执行程序池的一部分),并且您已经使应用程序的其余部分与此代码无阻塞。在<{1}}等待更新时阻止此操作 EXPECT 。如果您不想主动轮询队列,甚至以其他方式处理更新,您甚至可以提供stream.hasNextLine()
。
然后你可以为输出做这样的事情:
BlockingQueue
请注意,我没有对此进行测试,您可能需要针对其他Checked例外稍微调整一下。您可能需要添加额外的错误检查代码(想到空处理)。此外,这不是完全线程安全,但对于大多数用途来说可能“足够好”。