Skaner (System.in) - jak anulować / pominąć oczekiwanie na wejście

Zastanawiam się tylko, jak kontrolować wejścia konsoli w osobnych wątkach?
Mam wątek A i wątek B i wątek C; B i C kontrolują dane wejściowe użytkownika ... rzecz w tym, że nie jestem pewien, jak przełączać między wątkami B i CscanIn.nextLine(); ponieważ B wydaje się zapętlać dwie niepotrzebne iteracje, zanim wątek C może przerwać B :(

Główny wątek:

  public class Main
        {
            private volatile ThreadGroup threadGroup=new ThreadGroup();//contains concurrent hash map...
            private volatile TaskManager taskManager=new TaskManager(threadGroup);
            private A a=new A(threadGroup);
            private B b=new B(threadGroup,taskManager);
            private C c=new C(threadGroup);


     Main()
    {

      b.start();

      threadGroup.add(a,"A");
      threadGroup.add(b,"B");
      threadGroup.add(c,"C");
    }

    public static void main(String args[]){new Main();}

        }

Fragment metody TaskManager:

...
public synchronized void threadCMaybeCanBeStartedLater()
{
      this.getThreadGroup().get("A").start(); 
}
...

wątek Kod taki jak a(nadpisywana wywołuje metodę uruchamiania):

public void loopIt()
{
   Random generator = new Random(); 
   A: while(!this.interrupted())
{
   Thread.sleep(1000);

   int i=generator.nextInt(100)+1;
   int j=generator.nextInt(100)+1;
   if(i==j){this.invokeC(); System.out.println("event : i==j");}

    }
 }

private void invokeC()
{
  if(!this.getThreadGroup().get("C").isAlive())this.getThreadGroup().get("C").start(); 
}

kod wątku B jak:

public void loopIt() throws InterruptedException
    {


        Scanner scanIn = new Scanner(System.in);

        B: while(!this.isInterrupted())
        {

            Thread.sleep(1000);

            String command= scanIn.nextLine();
...

         if(command.equals("a"))
        {   
            System.out.println("a was entered");
            this.getTaskManager().threadCMaybeCanBeStartedLater();//             
            continue;
        }
        if(command.equals("b"))
        {   
           System.out.println("b was entered");            
           continue;
        }
        if(command.equals("c"))
        {
            System.out.println("c was entered");
            continue;
        }
        else{System.out.println("no such command");}

    }

}

wątek C(wywołuje metodę run)

public void loopIt() throws InterruptedException
        {
            getThreadGroup().get("B").interrupt();

            Scanner scanIn = new Scanner(System.in);

            C: while(!this.isInterrupted())
            {

                Thread.sleep(1000);

                String command= scanIn.nextLine();
    ...

             if(command.equals("d"))
            {   
                System.out.println("d was entered");             
                continue;
            }
            if(command.equals("e"))
            {   
               System.out.println("e was entered");            
               this.interrupt();
               break C;
            }
            if(command.equals("f"))
            {
                System.out.println("f was entered");
                continue;
            }
            else{System.out.println("no such command");}

        }

       getThreadGroup().get("B").start();

    }

... jak widzisz, koncepcja głównego kodu (patrz Fragment wątku) to „nie wieszgdy wątek C może zostać uruchomiony, ale gdy się uruchomił, musisz dać mu konsolę„; to wszystko; jeśli był to GUI, nie było problemu, ale aplikacja przypominająca konsolę sprawia, że ​​jest to dość problematyczne ...

Więc pytanie brzmi ... jak przerwać / ponownie uruchomić wątek B natychmiast z wątku C w tym przypadku?

Dzięki

questionAnswers(3)

yourAnswerToTheQuestion