2012-07-03 3 views
1

멀티 스레딩 환경에서 스레드 실행 마지막에 실행되는 큐 이벤트 인 리스너를 어떻게 구현합니까? 원하는 동작은 각 스레드가 이벤트에 대해 자체 큐를 가지므로 혼합되지 않고 원자 적으로 실행되지 않습니다. 따라서 스레드 A가 listener.execute()를 호출하면 "his"이벤트 만 실행됩니다.스레드 구현 당 큐

내가 생각할 수있는 유일한 방법은 ThreadLocal 변수를 사용하는 것이지만 complications here을 사용하면 차라리 어떤 것을 사용하지 않을 것입니다.

당신은 트리가 있고 x 노드를 제거하려고한다고 가정하면 각 "새로 고침"이벤트 후에 x 번 새로 고침을 실행하지 않으려 고하지만 큐에 넣고 끝에 실행하는 것이 좋습니다. .- 여분의 x-1 새로 고침 :-)

+0

나는 당신이하고 싶은 것을 정말로 이해하지 못합니다. 리스너는 이벤트를 수신합니다. 이벤트를 큐에 넣지 않습니다. 왜 각 큐에 다른 대기열이나 다른 리스너를 전달할 수 없습니까? –

+0

일부 이벤트는 즉시 실행되며 일부 이벤트 유형은 한 번에 (어쨌든) 원자 적으로 실행되어야합니다. 다른 방식으로 서로 관련되기 때문에 ... 다른 리스너를 스레드로 전달합니까? – lisak

+0

'for (int i = 0; i <10; i ++) {Runnable r = new MyRunnable (new MyListener()); 새 스레드 (r) .start(); }' –

답변

1

정말로 ThreadLocal을 피하려면 패턴을 반전시키고 소유자 스레드의 weak reference을 (고유 한) queue의 모든 이벤트와 함께 저장할 수 있습니다.

소유자가 더 이상 사용할 수 없으면 다른 스레드로 재배포 할 수도 있습니다.

하지만 "스레드 실행 끝"에서 실행되는 이벤트 대기열에 대한 필요성을 결코 알지 못하기 때문에 약간 확신 할 수 없습니다. 당신은 정말로 스레드를 가지고 있습니까? 아니면 정말로 태스크 또는 실행 파일입니까?

+0

이들은 http 요청 스레드별로 일반적입니다. – lisak

0

각 스레드가 실행 종료시 자신의 OWN 큐를 가지면 모든 큐가 단지 1-MEMBER 큐가되지는 않습니까?