2011-05-10 4 views
0
 
    1 LinkedBlockingQueue queJobs = new LinkedBlockingQueue(150); 
    2 .......... 
    3 .. Some other code.... 
    4 .......... 
    5 Job curJob = queJobs.take(); 
    6 .................... 
    7 .. Again some other code... 
    8 .................... 
    9 if(condition1){ 
    10 queJobs.put(curJob); 
    11 } 

내 조건은 조건 1이 참일 때 대기열에 객체를 넣을 때입니다. 하지만 처음에는 대기열의 맨 위에 있었지만 놓은 후에 대기열의 끝에 갈 것입니다.
내 요구 사항은 다음과 같습니다.
1. 큐 상단에 요소를 넣을 수 있습니다.
또는
2. 어떻게 든 대기열에서 요소를 제거하지 않고 5 행을 기다릴 수 있습니다.Java - LinkedBlockingQueue 문제

답변

3

큐는 한쪽 끝에서 읽히고 다른 쪽 끝에서 쓰도록 정의됩니다. 따라서 다시 되돌릴 수는 없습니다. 대신에 LinkedBlockingDeque을 사용할 수 있습니다.이 점에 대해서는 좀 더 다재다능합니다.

이 옵션이 아닌 경우 peek()을 사용하여 curJob을 가져 오지 만 제거 할 수는 없으며 나중에 if (!condition1) 만 제거하면됩니다.

UPDATE

하지만 테이크를 사용하고는() 때문에, 대기열까지 차단 실행이 비어 있습니다.

peek()이 확실히 작동하지 않습니다. 하지만 전반적인 논리에있어서 단점이 의심됩니다. 일반적으로 대기열에 다시 작업을 넣을 필요는 없습니다. 어쩌면 더 나은 해결책은 시작했지만 끝나지 않은 작업을 넣는 작업자 스레드에만 알려진 다른 모음을 사용하고 작업 대기열 이전에 해당 모음에서 읽는 것입니다.

+0

고맙습니다. LinkedBlockingDeque가 나를 도와 줄 것이라고 생각합니다. peek()은 확실히 내 용도가 아닙니다. – Aniruddha

+0

thanx LinkedBlockingDeque가 내 문제를 해결했습니다. – Aniruddha

1

헤드를 검색하지만 제거하지 않는 peek()을 사용할 수 있습니다. 그런 다음 나중에 condition1이 거짓인지 확인하십시오. 그렇다면 take()로 제거하십시오.

머리에 요소를 다시 추가 할 수는 있지만 지저분합니다. 당신은 toArray()를 호출 할 수 있습니다 toList() 인덱스에 추가 지원되는 0

참조 :. http://download.oracle.com/javase/6/docs/api/java/util/concurrent/LinkedBlockingQueue.html

+1

그러나 take()를 사용 중이므로 대기열이 비어있을 때까지 실행을 차단합니다. 큐에 요소를 추가하는 두 번째 스레드가 있고 큐 요소를 처리하는 스레드의 실행을 중지해야합니다. – Aniruddha

1

더 잘 맞는다는 요소에 우선 순위를 할당 할 수 있습니다 것 인 PriorityBlockingQueue를 사용할 수 있습니다. 이것은 당신이 요구 한 것과 정확히 일치하지는 않지만 단지 제안 일뿐입니다.

+0

제안을 주셔서 감사합니다 – Aniruddha