Облицовка трудностей при приостановке потока с пользовательским вводом в консоль

Я могу приостановить поток с помощью пользовательского ввода в консоли, но не могу возобновить его снова с пользовательского ввода.

Я хочу возобновить поток, когда пользователь вводит "n". Опять же, это начнется с предыдущего состояния, пожалуйста, помогите людям. Благодарю.

import java.io.Console;
import java.util.Scanner;

 class NewThread implements Runnable {

 String name; // name of thread
 Thread t;
 boolean suspendFlag;
 NewThread(String threadname) {
 name = threadname;
 t = new Thread(this, name);
 System.out.println("New thread: " + t);
 suspendFlag = false;
 t.start(); // Start the thread
 }
 // This is the entry point for thread.
 public void run() {

 // String username = scanner.nextLine();

 try {
 for(int i = 5000; i > 0; i--) {
 System.out.println(name + ": " + i);
 Thread.sleep(200);

 //String username = scanner.nextLine();
// if(username.equals("y"))
// {
// mysuspend(); 
// }

 synchronized(this) {
 while(suspendFlag) {

 wait();

 }
 }
 }
 } catch (InterruptedException e) {
 System.out.println(name + " interrupted.");
 }
 System.out.println(name + " exiting.");
 }
 void mysuspend() {
 suspendFlag = true;
 }
 synchronized void myresume() {
 suspendFlag = false;
 notify();
 }
 }

 class SuspendResume {
 public static void main(String args[]) {


 NewThread ob2 = new NewThread("One");
 // System.out.println(username);
 try { Scanner scanner = new Scanner(System.in);
 String username = scanner.nextLine();
 if(username.equals("y"))
 {
 Thread.interrupted();

 // Thread.sleep(10000);
 ob2.mysuspend();
 System.out.println("Suspending thread One");
 Thread.sleep(10000);

 // ob2.myresume();
 System.out.println("Resuming thread One");
 }
 if(username.equals("n"))
 {

 ob2.myresume();
 }
 } catch (InterruptedException e) {
 System.out.println("Main thread Interrupted");
 }
 // wait for threads to finish
 try {
 System.out.println("Waiting for threads to finish.");
 ob2.t.join();

 } catch (InterruptedException e) {
 System.out.println("Main thread Interrupted");
 }
 System.out.println("Main thread exiting.");
 }

}
2 ответа

Неправильный поток управления.

Вы читаете ввод только один раз. Если он равен y вы приостанавливаете поток, но тогда вы никогда не заходите в оператор if, который проверяет n для возобновления потока. Я бы сделал это так:

public class Test {
 public static void main(String args[]) {

 NewThread ob2 = new NewThread("One");
 Scanner scanner = new Scanner(System.in);
 while(true) {
 String username = scanner.nextLine();
 if (username.equals("y")) {
 Thread.interrupted();

 // Thread.sleep(10000);
 ob2.mysuspend();
 System.out.println("Suspending thread One"); 

 }
 if (username.equals("n")) {
 ob2.myresume();
 System.out.println("Resuming thread One");
 }
 if (username.equals("q")) {
 ob2.myresume();
 break; 
 }
 }
 // wait for threads to finish
 try {
 System.out.println("Waiting for threads to finish.");
 ob2.t.join();

 } catch (InterruptedException e) {
 System.out.println("Main thread Interrupted");
 }
 System.out.println("Main thread exiting.");
 }
}

Если пользователь вводит "y", поток будет приостановлен. Если они войдут в "n", они будут возобновлены, и если они войдут в "q", вы просто сломаете цикл и дождитесь окончания потока.


1.. Вы используете методы wait() и notify(), но хотите приостановить и возобновить поток. Так что это не правильный путь. Эти методы используются для освобождения любого ресурса (синхронизированного) из одного потока, чтобы сделать его доступным для некоторого другого потока и снова вернуть этот ресурс в тот же поток.

Вместо этого следует использовать только методы suspend() и resume().

Вы не можете использовать wait() и notify() в своей программе.

2.. Попробуйте сделать это следующим образом:

Создайте два потока. Один, который получит данные от пользователя и второй, которые вы хотите приостановить и возобновить.

Согласно вводу пользовательского вызова приостановить и возобновить методы во втором потоке.

* В вашем коде вы вводите пользователя только один раз. Поэтому, когда приостановленная нить никогда не возобновляется.

licensed under cc by-sa 3.0 with attribution.