반복자의 원본 데이터를 병렬로 처리 할 수 있도록 여러 스레드에서 동시에 읽을 수있는 반복기를 갖고 싶습니다. 문제는 다른 스레드로 갈 수 있으므로 실제로는 hasNext()
을 논리적 인 next()
과 연결할 수 없다는 것입니다. (즉, 두 개의 스레드가 hasNext()
을 호출 할 수 있으며 각각 하나의 항목 만 있기 때문에 두 번째 스레드가 실패합니다.) 문제는 일부 소스의 경우 실제로 다음 요소가 있는지 알지 못합니다. 그것을 읽으려고 노력하십시오. 그러한 예가 파일에서 행을 읽는 것입니다. 또 하나는 Lucene 색인에서 Term
인스턴스를 읽는 것입니다.일부 소스에서 동시 반복자를 만드는 방법은 무엇입니까?
필자는 반복기 내부에서 큐를 설정하고 별도의 스레드로 큐를 공급할 생각을하고있었습니다. 이렇게하면 hasNext()
이 대기열 크기로 구현됩니다. 하지만 그 스레드가 굶어 죽을 수 있기 때문에 대기열이 채워지는 것을 어떻게 보장 할 수 있는지 알지 못합니다.
반복자 계약을 무시하고 NoSuchElementException
이 던져 질 때까지 next()
을 철저히 호출해야합니까?
문제를보다 세련되게 처리하는 방법이 있습니까?
빠른 응답을 보내 주셔서 감사합니다. 이것은 의미가 있지만, 대기열을 채워서 굶어 죽지 않았는지 확인해야합니다. 맞습니까? 잠재적으로 메모리에 들어가기에는 너무 많은 요소가 있기 때문에 모든 요소를 큐에 넣을 수는 없습니다. 나는 큐에 추가로 레코드가 더 이상 큐에 추가되지 않음을 나타내는'AtomicBoolean'을 가져야한다고 생각합니다. –
스레드가 queue.take()를 수행하도록하고, 할 일이 없다는 신호를 보내려면 일종의 poison pill (http://www.javaspecialists.eu/archive/Issue016.html)을 사용할 수 있습니다. – sbridges
두 개 이상의 쓰레드가'take()'를 호출하고 그 중 하나가 poison 알약을 얻는 반면, 두 번째 쓰레드는 빈 큐에 걸리는 것이 가능한가? 이것은'take()'가 메인 쓰레드에서 수행 되어야만하는 값을 작업자 쓰레드로 보내야 함을 의미한다. 또는 나는 무엇인가 놓치고 있냐? –