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