2012-12-07 3 views
0

안녕 작업 I 다음 코드 조각이 :자바 여러 스레드가 하나 개의 필드에

public Item get(int id) 
{ 
    Item i = null; 
    for(Worker w : workers) 
    { 
     w.get(id, i); // Several threads start reading that item from data sources 
    } 
    while(i == null) // Loop until item is found 
    { 
     // this.pause(); there should be a pause but it's not a thread, so I can't do it. 
    } 
    return i; 
} 

내가 더 나은 방법이 있어야한다고 생각, 그 빈 루프 않고 있습니다.

get 기능을 일시 중지하고 작업자 중 한 사람이 알림 만 다시 시작하는 것과 관련된 문제입니다.

+0

이 빈 루프가 작동 할 수 있습니까? – NPE

+0

그 질문이나 진술인가? –

+1

'i'는 코드에서 null이되지 않습니다. 너는'i'가 아니라 근로자에게'null '을 전달한다. –

답변

2

여기에서 BlockingQueue을 사용할 수 있습니다. 대기열의 인스턴스를 만듭니다. 그리고 그것을 모든 노동자들에게 전하십시오. 작업자가 항목을 찾으면 대기열에 추가합니다. 그리고 당신은 큐가 비어 있지 때까지 기다립니다 큐가 비어있는 경우에만 그들이 항목을 추가 노동자

public Item get(int id) { 
    BlockingQueue<Item> queue = new ArrayBlockingQueue<Item>(1); 
    for(Worker w : workers) { 
     w.get(id, queue); // Several threads start reading that item from data sources 
    } 
    return queue.take(); 
} 

사용 queue.offer(foundItem); 있도록.

+0

좋습니다. 훌륭한 솔루션입니다. 다른 스레드의 반환 값을 올바르게 처리합니다 (예 : 무시). –

+0

교환 목적으로 SynchronousQueue를 사용해야합니다. http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/SynchronousQueue.html 물론 다른 작업자도 제어해야합니다. 그들은 오버 헤드를 만든다. – kornero

관련 문제