1

こんにちは、他の多くの回答を読みましたが、入力を送信せずに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を閉じようとしました。

4

3 に答える 3

1

を呼び出す前に、利用可能なデータがあるかどうかを確認できます。BufferedReader.readLine()

while(true) {
    if (!listening) break;
    if (System.in.available() > 0) {
        try {
            fromUser = stdIn.readLine();
            // etc.
于 2012-11-23T14:56:06.497 に答える
1

thread.interruptプロセスを中断するようにスレッドにシグナルを送るために使用する必要があります。InterruptedExceptionスレッドによって起動されたをキャッチする準備をしてください。

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

于 2012-11-23T14:56:20.300 に答える
0

stdIn.close(); を使用して BufferedReader を閉じることができると思います。

于 2012-11-23T14:56:33.317 に答える