2016-12-05 3 views
0

Я хочу приостановить и возобновить поток, нажав клавишу. Идея состоит в том, что поток генерирует числа, которые отправляются через канал в другой поток, и пользователь может приостановить и возобновить поток, нажав клавишу «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(); 
} 

}

+0

в порядке. в чем вопрос? – Jobin

+0

Вы не должны так поступать. Передайте 'BlockingQueue' в ваш поток и заставьте его проталкивать все его номера через него. Затем вы можете просто прекратить чтение из очереди, чтобы приостановить процесс. – OldCurmudgeon

+0

В качестве альтернативы вы можете попробовать http://stackoverflow.com/a/10669623/823393 – OldCurmudgeon

ответ

0

Возможно нить время паузы не один, что следует читать клавиатуру.

0

Просто комментарий pauseThread() метода внутри run Конечно, вы должны комментировать resumeThread из-за эти методы не Neede. Я имею в виду, когда вам нужно просто пропустить основные методы.