如何使用BufferedReader(Java)中断读操作?

时间:2012-11-23 14:30:29

标签: java bufferedreader

你好,虽然我读了很多其他的回答我不明白如何关闭BufferedReader而不发送输入。这是我的程序的阻止部分:

public class AuctionClientUserListener extends Thread {

    private PrintWriter out;
    private BufferedReader stdIn;
    private int udpPort;
    private boolean running = true;
    private boolean listening = true;

    // needs server connection out
    public AuctionClientUserListener(BufferedReader stdIn,PrintWriter out,int udpPort) {
        this.stdIn = stdIn;
        this.out = out;
    }

    public void run() {
        String fromUser;

        while(true) {
            if(!listening) {
                break;
            }
            try {

                fromUser = stdIn.readLine(); // BLOCKS

                if (fromUser != null) {
                        System.out.println("Me: " + fromUser);

                        // check if to send udp port
                        String[] spinput = fromUser.split(" ");
                        if(spinput[0].equals("!login")) {
                            fromUser+=" "+udpPort;
                        }

                        out.println(fromUser);

                        if(fromUser.equals("!end")) {
                            listening = false;
                        }
                }
            } catch(Exception e) {
                listening = false;
            }
        }
        running = false;
    }

    public boolean running() {
        return running;
    }

    public void endListening() {

        this.listening =  false;
    }
}

当我从主线程调用“endListening()”时,程序终止 - 但不是在用户输入任何内容之前。我想让程序立即终止 - 如何使用这个BufferdReader(像BufferedReader(new InputStreamReader(System.in))这样创建)?

我试图在主线程中调用此线程上的stdIn.close()和thread.interrupt(),但它不起作用。我还试图关闭主线程中的InputStreamReader。

3 个答案:

答案 0 :(得分:1)

您可以在致电BufferedReader.readLine()之前查看if there's data available,即

while(true) {
    if (!listening) break;
    if (System.in.available() > 0) {
        try {
            fromUser = stdIn.readLine();
            // etc.

答案 1 :(得分:1)

您必须使用thread.interrupt来通知线程中断其进程。准备好抓住线程发起的InterruptedException

http://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html

答案 2 :(得分:0)

我想你可以使用stdIn.close();

关闭你的BufferedReader