如何绕过扫描仪检查下一个元素(如果这是有道理的)

时间:2012-06-04 15:17:01

标签: java networking java.util.scanner

我正在尝试创建一个连续的线程,服务器接收/发送来自客户端的消息但是当我尝试检查下一个元素时它会被卡住:

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();
    }

如何让循环不会卡在指定点

1 个答案:

答案 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例外稍微调整一下。您可能需要添加额外的错误检查代码(想到空处理)。此外,这不是完全线程安全,但对于大多数用途来说可能“足够好”。