按键暂停并恢复线程

时间:2016-12-05 13:33:03

标签: java multithreading

我想通过按键暂停和恢复一个线程。这个想法是线程生成通过管道发送到另一个线程的数字,用户可以通过按“p”键暂停和恢复线程。我现在拥有的是:线程等到我按任意键并且随机数显示在屏幕上(输出是另一个线程),然后线程等待直到我按下另一个键...但如果我按'p '线程停止了,我无法让它恢复。

import java.io.IOException;
import java.util.Random;
import java.io.PipedOutputStream;
import java.util.Scanner;


public class Producer extends Thread {
    private static final int MIN = 0;
    private static final int MAX = 60;
    private volatile boolean pause;
    private PipedOutputStream output = new PipedOutputStream();

public Producer(PipedOutputStream output) {
    this.output = output;
}

@Override
public void run() {
    Random rand = new Random();

    Scanner reader = new Scanner(System.in);
    int random;
    String key = "p";
    String keyPressed;
    try {     
        while (true) {
            keyPressed = reader.next();
            if (keyPressed.equalsIgnoreCase(key)) {
                pauseThread();
            } else {
                random = rand.nextInt(MAX - MIN + 1);
                output.write((int) random);
                output.flush();
                Thread.sleep(1000);

            }
            if (pause = true && keyPressed.equalsIgnoreCase(key)) {
                    resumeThread();
            }
        }
        output.close();
    } catch (InterruptedException ex) {
        interrupt();
    } catch (IOException ex) {
        System.out.println("Could not write to pipe.");
    }
}

public synchronized void pauseThread() throws InterruptedException {
    pause = true;
    while (pause)
        wait();
}

public synchronized void resumeThread() throws InterruptedException {
    while (pause) {
        pause = false;
    }
    notify();
}

}

2 个答案:

答案 0 :(得分:0)

暂停的线程可能不是应该读取键盘的线程。

答案 1 :(得分:0)

只需评论pauseThread()内的run方法 当然,你应该评论resumeThread,因为这些方法不是必须的。我的意思是,当你在prss' p'你只需要跳过主要方法。