2012-06-26 3 views
0

현재 웹 - 스파이더 또는 파일 검색 시스템처럼 보이는 알고리즘이 있습니다. 처리하고 처리 할 요소 모음이있어 더 많은 요소를 큐에 넣을 수 있습니다.다중 스레드는 대기열 계약의 일부입니까?

그러나이 알고리즘은 단일 스레드입니다. 왜냐하면 저는 db에서 데이터를 가져오고 한 번에 하나의 db 연결 만 갖고 싶기 때문입니다. 현재 상황에서는 성능이 중요하지 않습니다. 디버깅을 쉽게하기 위해 시각화 목적으로 만이 작업을 수행하고 있습니다.

나를 위해 그것은 큐 추상화를 사용하는 것이 자연 스럽지만 큐를 사용하는 것이 멀티 스레딩을 의미하는 것 같습니다. 이해할 수있는 것처럼 대부분의 표준 Java 큐 구현은 java.util.concurrent 패키지에 있습니다.

list of Queue interface implementations

은 내가 푸시 당겨하지만이 경우에 사용하는 것이 더 자연 어떤 데이터 구조를 알고 싶습니다 지원 데이터 구조에 갈 수 있다는 것을 이해합니다 (괜찮습니다 단일 스레드 응용 프로그램에서 대기열을 사용 하시겠습니까?).

답변

1

대기열은 java.util에 정의되어 있습니다. LinkedList는 큐이며 매우 동시성이 좋지 않습니다. Queue 메서드 블록은 없으므로 단일 스레드 관점에서 안전해야합니다.

3

기본적으로 단일 스레드로 java.util.concurrent 구조를 사용하는 것이 좋습니다.

주의해야 할 주요 사항은 통화 차단입니다. ArrayBlockingQueue과 같은 제한된 크기의 구조를 사용하고 전체 큐에 put 메서드를 호출하면 호출 스레드는 큐에 공간이있을 때까지 차단됩니다. 어떤 종류의 대기열을 사용하고 비어있을 때 take을 호출하면 대기열에 항목이있을 때까지 호출 스레드가 차단됩니다. 응용 프로그램이 단일 스레드 인 경우 그러한 일이 결코 일어나지 않을 수 있기 때문에 영원히 차단됩니다.

put 차단을 피하려면 LinkedBlockingQueue과 같은 제한되지 않은 구조를 사용할 수 있습니다. 제거시 블로킹을 방지하려면 비 블로킹 작업을 사용하십시오. remove은 큐가 비어 있고 poll이 null을 반환하면 예외를 throw합니다.

Queue 인터페이스의 구현은 java.util.concurrent에 없습니다. ArrayDeque은 아마도 좋은 선택 일 것입니다.

1

단일 스레드 응용 프로그램에서 모든 큐를 사용하는 것이 좋습니다. 동시 스레드가없는 경우 동기화 오버 헤드는 무시할 수 있어야하며 요소 처리 시간이 매우 짧은 경우에만 눈에 띄게됩니다.

관련 문제