2013-06-27 3 views
2

내 응용 프로그램에는 여러 스레드의 데이터 요청을 처리하는 단일 클래스 (직렬 COM 포트와 통신)가 있습니다. 요청이 처리되는 동안 스레드는 wait()이어야합니다. 대기중인 모든 스레드를 깨우지 않고 데이터 준비가되었음을 스레드에 알리고 (다시 보내려면) 어떻게 수 있습니까?특정 스레드에 데이터 전송

+4

자바 1.4를 사용할 필요가 없다면'java.util.concurrent'의 객체를 사용해야하고'wait/notify'를 사용하면 안됩니다. –

+2

[BlockingQueue] (http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/BlockingQueue.html)를 사용하십시오. - 대기열에서 스레드가 대기하도록 'take'를 사용하십시오. 데이터가 준비 될 때까지 –

+1

싱글 톤은 멀티 스레딩 프로그래밍에서 악몽입니다. –

답변

3

모든 스레드에 하나씩 blocking queue을 작성하고 싱글 톤에 삽입하십시오. 답변이 도착하면 적절한 스레드의 큐를 선택하고 제안 (E o) 메소드가 포함 된 메시지를 해당 메시지에 넣으십시오.

take() 메소드가있는 스레드에서 무한 시간 동안 응답을 기다리거나 대기 시간 대기를 위해 poll (긴 시간 초과, TimeUnit 유닛)을 사용할 수 있습니다.

concurrent queue을 추가로 사용하면 차단하지 않고 단일 입력을 공급할 수 있습니다.

2

@Lexandro는 좋은 대답을 가지고 있지만 요구 사항을 충족시키는 더 간단한 대안은 (스레드 대기/차단은 o.k입니다.) 정적 클래스의 메소드를 동기화하는 것입니다.

+0

나는 동의하지만, 나는 개인적으로 동기화 된 블록/방법의 사용법이없는 해결책을 선호한다. – Lexandro

+0

동의. 나는 너의 upvote 줄거야. – user949300

+0

나는 작동하지 않는 유사한 해결책을 시도했다. 그 원인은 모든 데이터를받는 하나의'serialPortActionListener'였다. 그러나 각 패킷은 특정 스레드 (스레드가 무선 송신기에서 데이터를 요청하므로 해당 클라이언트로 데이터를 전송할 수 있도록 해당 주소를 다시 전송합니다)에 직면합니다. 내가 보았 듯이, 데이터를 특정 쓰레드로 리다이렉션 할 필요가있는'serialPortActionListener' 인스턴스가 하나있다. 그래서 어떻게 든 각 스레드에 대한 참조를 유지해야합니다. – BrunoPires

관련 문제