Столкнувшись с трудностями в приостановке потока с пользовательским вводом в консоли - PullRequest
1 голос
/ 24 января 2012

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

Я хочу возобновить поток, когда пользователь вводит "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 ]

1 голос
/ 24 января 2012

Ваш поток управления неверен.

Вы читаете ввод только один раз. Если оно равно 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», вы просто разорвете цикл и дождитесь окончания потока.

0 голосов
/ 24 января 2012

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...