스칼라에서 스레드를 알 수있는 방법 : 잠시만 기다려주십시오. 아니면 메시지를받을 때까지 기다려야합니까? 즉 최대 t 초 동안 휴면 상태가되지만, t가 끝나지 않고 특정 메시지를 수신하는 경우에 일어나야합니다.스칼라 : 슬리핑 웨이브
답변
또는 조건 변수를 사용할 수 있습니다.
val monitor = new AnyRef
var messageReceived: Boolean = false
// The waiting thread...
def waitUntilMessageReceived(timeout: Int): Boolean = {
monitor synchronized {
// The time-out handling here is simplified for the purpose
// of exhibition. The "wait" may wake up spuriously for no
// apparent reason. So in practice, this would be more complicated,
// actually.
while (!messageReceived) monitor.wait(timeout * 1000L)
messageReceived
}
}
// The thread, which sends the message...
def sendMessage: Unit = monitor synchronized {
messageReceived = true
monitor.notifyAll
}
하지만 임의의 깨우기 문제는 while (! messageReceived)이 아닌 if (! messageReceived)가 처리해야합니다. – user1377000
당신이 선택의 여지가 없다면 (예 : 성능이 중요하고 필요한 로직이 비표준이기 때문에) 수동으로이 솔루션을 롤업하는 것은 매우 바람직하지 않습니다. 잊어 버리기가 너무 쉽습니다. 스칼라와 자바에는 더 높은 수준의 구조가 사용되어야합니다. –
@ user1377000 - 임의의 깨우기는 'while'에 의해 처리되지만 시간 초과 동작은 내 제안에서 잘못된 것입니다. 각 깨우기 후에 시간 초과가 초기 값으로 다시 시작됩니다. 최악의 경우, 이것은 "영원히 대기"시나리오로 이어질 수 있습니다. – Dirk
주어진 시간 동안 잠자기 상태로 만들지 말고 Timeout() 메시지에서만 깨어나게 한 다음 "깨우기"를 원하면이 메시지를 중간에 보낼 수 있습니다.
대답은 메시지 이 무엇인지에 크게 의존한다. 액터 (이전 품종 또는 Akka variety)를 사용하는 경우 receive에서 시간 초과 값을 간단하게 지정할 수 있습니다. (이 메시지를 때까지 실제로 실행되지 반작용, 그래서 당신은 그것에 제한 시간을 배치 할 수 없습니다.)
// Old style
receiveWithin(1000) {
case msg: Message => // whatever
case TIMEOUT => // Handle timeout
}
// Akka style
context.setTimeoutReceive(1 second)
def receive = {
case msg: Message => // whatever
case ReceiveTimeout => // handle timeout
}
그렇지 않으면, 정확하게는 "메시지"가 무엇을 의미합니까?
메시지를 보내는 쉬운 방법 중 하나는 이런 종류의 작업을 위해 만들어진 Java 동시 클래스를 사용하는 것입니다. 예를 들어, 메시지를 길게하는 java.util.concurrent.SynchronousQueue
을 사용할 수 있으며, 수신기는 제한 시간 걸리는 poll
메서드를 호출 할 수 있습니다
// Common variable
val q = new java.util.concurrent.SynchronousQueue[String]
// Waiting thread
val msg = q.poll(1000)
// Sending thread will also block until receiver is ready to take it
q.offer("salmon", 1000)
ArrayBlockingQueue
원하는 경우 보낸 사람은 할 수 (이러한 상황에서 유용을 버퍼에 메시지를 패킹).
- 1. 레일 웨이브 웨이브
- 2. 웨이크 업 슬리핑 스레드
- 3. 슬리핑 쓰레드 리소스에 접근하기
- 4. Android C2DM 슬리핑 전화기
- 5. 오브젝트 슬리핑 방지 C++
- 6. 자바 웨이크 슬리핑 스레드
- 7. 레일 웨이브 캐리어 웨이브 에러
- 8. 이벤트 및 슬리핑 스레드 실행
- 9. 대기/슬리핑 스레드의 원인 찾기
- 10. 슬리핑 스레드 인터럽트 또는 중지
- 11. 파이 게임 인 웨이브 웨이브 재생
- 12. 웨이브 기반 게임에서 웨이브 정보 저장하기
- 13. Invoke Windows Form 스레드 및 슬리핑
- 14. 액션 스크립트 3에서 슬리핑 모드를 처리하는 방법
- 15. 슬리핑 설명 파일 양식 기존 Java 클래스
- 16. PHP/Python - 백그라운드에서 멀티 스레드 슬리핑
- 17. 루비 타임 아웃 및 슬리핑 스레드
- 18. D4 웨이브 렛을 사용한 이미지의 이산 웨이브 렛 변환
- 19. 파이썬에서의 웨이브 분석
- 20. 멕시코에서의 웨이브 효과 (깜박임)
- 21. 리눅스에서 웨이브 파일 재생
- 22. Python을 이용한 웨이브 시뮬레이션
- 23. 웨이브 시스템 구현
- 24. QPainTextEdit 웨이브 추가
- 25. Android에서 웨이브 파일 재생
- 26. 웨이브 스트림을 분석하십시오.
- 27. 웨이브 분석 - WiiMote Acceleration
- 28. 이미지 코사인 웨이브
- 29. 무료 웨이브 테이블 신디사이저?
- 30. 루브의 웨이브 폼 시각화
IIRC, 대기 (긴 시간 초과) 과부하가 있습니까? 그렇다면, 어떤 객체를 기다리고 메시지가 사용 가능한지를 알린다. –