簡體   English   中英

如何使用 BufferedReader (Java) 中斷讀取操作?

[英]How to interrupt a read operation using BufferedReader (Java)?

您好,雖然我閱讀了很多其他答案,但我不明白如何在不發送輸入的情況下關閉 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。

您可以在調用BufferedReader.readLine()之前檢查是否有可用數據,即

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

您必須使用thread.interrupt向線程發出信號以中斷其進程。 准備好捕獲線程啟動的InterruptedException

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

我想你可以使用 stdIn.close() 關閉你的 BufferedReader;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM