challenge 出力の一時停止と再開

起動すると、標準出力に1秒毎に'a'の1文字を出力し続けるプログラムで、 以下の条件を満たすものを「どう書く?」

  • 'q'キーが押されるとプログラムは終了する
  • 出力中に'p'キーが押されると一時停止する
  • 一時停止中に'p'キーが押されると出力を再開する

Posted feedbacks - Java

Javaでは、STDINがバッファされてしまうため Enterが押下されるまで読み込めません。 そのため、下記のコードでは p + Enterと、q + EnterでSuspendとQuitします。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
public class Sample179 implements Runnable {

    private final Object lockObj_ = new Object();

    private boolean isSuspend_ = false;

    public boolean getSuspend() {
        synchronized (lockObj_) {
            return isSuspend_;
        }
    }
    public void changeSusupend() {
        synchronized (lockObj_) {
            isSuspend_ = !isSuspend_;
            if (isSuspend_) {
                lockObj_.notifyAll();
            }
        }
    }

    @Override
    public void run() {
        try {
            while (Thread.currentThread().isAlive()) {
                synchronized (lockObj_) {
                    while (getSuspend()) {
                        lockObj_.wait(1000);
                    }
                }
                System.out.print('a');
                Thread.sleep(1000);
            }
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
    }


    public static void main(String[] args) {
        final Sample179 sample = new Sample179();
        Thread thread = new Thread(sample);
        thread.setDaemon(true);
        thread.start();
        try {
            while (true) {
                char c = (char) System.in.read();
                if (c == 'q') break;
                if (c == 'p') {
                    sample.changeSusupend();
                }
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

Index

Feed

Other

Link

Pathtraq

loading...