2012-06-25 4 views
0

액터 내에서 스레드를 실행하고있는 객체를 종료하는 가장 좋은 방법은 무엇입니까? 최고의 전략이 무엇인지 모르겠습니다.액터에서 스레드 실행

아무것도 특히 알고있을 가져가)

대부분의 주제는 모든 것을 스레드를 사용하는 아이디어 중심으로 돌고있는 것 같다,하지만 난 IO를 차단하고있어 제 3 자 코드를 다시 작성하는 옵션이 아니다 ?

답변

3

정확히 무슨 뜻인지는 분명하지 않습니다. 내가 잘못하면 사과드립니다. 별도의 쓰레드가 실행됩니다 일부 타사 API 인 상태 객체의 일환으로이 일부 Actor 클래스 A,이 (그리고 어쩌면에 콜백을 발행 할 수 있습니까?)

class A extends Actor { 
    val api = { ... } 
    def act() = { ... } 
} 

당신이 원하는 배우의 인스턴스 A을 종료하고 api에 의해 생성 된 스레드에 대해 우려하고 있습니다. 어떻게됩니까?

타사 API가 api (예 : destroy 메소드)을 처리하기위한 메커니즘을 제공하는 경우 해당 API를 호출하십시오. 아니면 배우를 명시 적으로 강제 종료 신호를 전송하고 그것을 정상적으로 종료 한 다음 API는 이러한 메커니즘을 제공하지

case 'Kill => api.destroy(); self.exit() 

경우 (내가 추가 할 수 있습니다 그것은 끔찍한 API입니다) 당신이 조금 붙어 있습니다. 액터를 종료 할 수는 있지만 별도의 스레드는 계속 실행됩니다. 물론 데몬 스레드 일 수 있으므로 전체적으로 JVM이 정상적으로 종료되지는 않습니다. 그렇지 않으면 프로그램을 정상적으로 종료하는 유일한 방법은 명시 적으로 sys.exit(0)을 적절한 위치에서 호출하는 것입니다.

+0

안녕하세요 oxbow_lakes, 답장을 보내 주셔서 감사합니다. self.exit() 호출과 "def act = {while (active) {receiveWithin (1000) {"루프를 벗어나는 것의 차이점은 무엇입니까? self.exit()는 추가 정리를 수행합니까? 나는 지금 무엇이 잘못되었는지 알아 냈습니다. 그러나 그 차이를 아는 것은 유익합니다. 감사합니다, Bryan –

+0

Self.exit이 (가) 배우를 종료합니다. 행위 방법을 깨는 것은 똑같습니다. 의도가 명확하다 –

+0

고마워, 그게 내가 생각한 것이지만 명확한 대답을 찾을 수 없었다. –