2

변화를 기다리는 상태로 스레드를 보유하는 방법이 있습니까? 나는이Java의 스레드 스테이트 머신

statemachine example

같은 statemachines을 위해 .. TLL 뭔가 앞으로 일어날 (변경 VAR, 호출 방법 등 ..) 아마도이 이벤트 리스너, 또는 동기화 된 객체/방법을 사용하여 필요 기다려

일반적인 aproach을 의미

단일 스레드 (및 GUI 없음) 응용 프로그램에서 작동 할 수있는 do {..} while (true) 루프를 사용하지만 스레드와 함께 사용할 수 없습니다. (최소한 코어를 사용하고 싶습니다. 모든 스레드 상태 머신)

: 그래서 간단한 (못생긴) 방법 는 "정기 검사"입니다 프로세서 걸리는 작업을 피하기 위해, 나는 다른 생각이

예를 동기화 된 객체를 정의하고 스레드 수면 대신에 대기를 사용하는 절전 모드가 추가 의미

   do{ 

        Switch(state) 
        { 

         case STATE_A: 
         //..A things       
         break; 

         case STATE_B: 
          //..B things       
         break; 

         ... 

         case STATE_Z: 
          //..Z things       
         break; 

        } 


// Here! =>   wait()? Thread.sleep(TIME_CONST)? //Hold and yield 


       }while(powerOn); 

의 단점은 사용의 복잡성을 추가 동기화 또는 TIME_CONST 내 일이 아무것도

내가 덕분에이를 수행하기위한 다른 아이디어를 알고 싶습니다 보이지 않는 것!

답변

5

예, wait/notify입니다. 그것이 바로 그 때문입니다.

또는 상태 시스템에 자체 스레드가 없어도됩니다. 다른 스레드는 흥미로운 일이 발생할 때 상태 시스템에서 update 메서드를 호출 할 수 있습니다.

+0

나는 그것이 복잡하다고 생각하는 것을보고, 가장 간단한 방법이다!, thanks –

1

Lock 및 Condition (Java 1.5+)을 사용할 수도 있습니다. wait/notify과 같으며 javadoc에 예제가 있습니다.

+0

나는 그것을 점검 할 것이고, 고맙다. –

1

이벤트 소스 스레드와 FSM 구현 스레드 사이에 Pipe을 사용해보십시오. 이것은 2 스레드 구현에 충분합니다.

2

대기열에 넣은 상태 시스템을 Umple로 지정하면이 코드가 생성됩니다. umple 상태 머신을 큐에 대기 상태로 지정하면 이벤트 (이름 지정된 메소드 호출)를 기다리는 스레드가 생성됩니다. 클래스의 다른 코드는 원래 스레드에서 동시에 발생할 수 있습니다. '대기 중'이라는 키워드는 상태 시스템의 정의 바로 앞에 위치해야합니다.

Umple에서 상태 시스템을 만드는 방법에 대한 자세한 내용은 http://statemachines.umple.org을 참조하십시오. 이 맥락에서 Umple을 자바 (그리고 다른 언어들)의 전처리기로 만 생각할 수 있습니다.

+0

굉장해 보인다! +1, 나는 그것을 시도 할 것이다. 나는이 질문에 너무 대답 할 수 있었다고 생각한다. http://stackoverflow.com/questions/4946213/petri-net-drawing-and-code-generation –