2011-09-21 3 views
0

코드를 일시 중지하지 않고 프로그램에 대해 일종의 콘솔을 만들려면 어떻게해야합니까? 예를 들어 루프를 실행해야하지만 콘솔에 명령을 입력하면 게임에서 명령이 무엇인지 확인하고 루프에서 처리하도록합니다. 루프는 명령을 기다리지 말고 명령문이 큐에 있는지 확인하기 위해 if 문을 가지고 있습니다.Java 입력을 일시 중지하지 않고

그런데 도움이된다면 전용 서버를 만들고 있습니다.

+0

스윙을 사용하고 있습니까? 명령 입력을위한 텍스트 필드에 이벤트 리스너를 연결할 수 있습니다. 아니면이 "게임"이 스윙을 사용하지 않는 것입니까? (당신은 "서버"라고 말했습니다 ....) –

답변

2

두 개의 별도 스레드로 실행하십시오.

class Server { 

    public static void main(String[] args) { 
     InputThread background = new InputThread(this).start(); 
     // Run your server here 
    } 
} 

class InputThread { 
    private final Server server; 
    public InputThread(Server server) { 
     this.server = server; 
    } 

    public void run() { 
     Scanner sc = new Scanner(System.in); 
     while(sc.hasNextLine()) { 
      // blocks for input, but won't block the server's thread 
     } 
    } 
} 
1

서버는 자체 스레드에서 실행해야합니다. 이렇게하면 루프를 일시 중지하지 않고 실행할 수 있습니다. 대기열을 사용하여 명령을 서버로 전달할 수 있습니다. 루프를 통과 할 때마다 서버는 대기열을 확인하고 하나 이상의 명령을 처리 할 수 ​​있습니다. 명령 행은 자체 스케줄에 따라 명령을 큐에 제출할 수 있습니다.

2

꽤 명백한 접근법이 있습니다 : 전용 스레드를 사용하여 InputStream에서 대기하고 이벤트/명령을 읽어 대기열로 전달하십시오.

메인 스레드가 정기적으로이 큐를 확인합니다. 모든 점검 후에 대기열에서 명령을 처리하거나 비어있는 경우 계속 수행합니다.

0

콘솔에서 별도의 스레드로 읽을 수 있습니다. 이것은 메인 쓰레드가 콘솔을 기다릴 필요가 없다는 것을 의미합니다.

심지어 서버 응용 프로그램도 스윙 GUI를 가질 수 있습니다. ;)

+0

나는 그것이 명령 행에서 작동하기를 원합니다. –

2

당신이 갖고 싶은 것은 명령 읽기 코드 실행을 유지하는 스레드입니다. 이처럼 시작해야합니다, 나머지 코드가 실행하는 "기본"스레드에서

class ReadCommand implements Runnable 
{ 
    public void run() 
    { 
     // Command reading logic goes here 
    } 
} 

: : 아마 다음과 같이 보일 것

또한
new Thread(new ReadCommand())).start() 

, ReadCommand에서 채워지고 다른 코드에서 읽혀지는 명령 큐가 필요합니다. 동시 Java 프로그래밍에 대한 설명서를 읽는 것이 좋습니다.

관련 문제