2013-08-12 2 views
3

저는 Java에 익숙하지 않으며 실습으로 스레드 라이브러리를 작성하려고합니다. 이 방법으로 작동합니다.작업자 스레드간에 작업을 배포하는 데 사용할 큐의 유형

주 스레드에서 일부 작업 (문자열)이 작업 대기열에 추가되고 작업자 스레드가 작업을 완료하면 완료 대기열에 추가됩니다. 메인 쓰레드는 완성 된 큐에서 결과를 얻습니다. 모든 작업이 완료되면 주 스레드가 작업자에게 작업을 중지 할 것을 알립니다. 여기에 내가 지금까지 쓴 몇 가지 코드가있다 :

public List<int> get() { 
    WorkerThread[] threads = new WorkerThread[numThreads]; 
    LinkedList<int> results = new LinkedList<>(); 
    int workCount = 0; 

    for (int i = 0; i < numThreads; i++) { 
     threads[i] = new WorkerThread(); 
     threads[i].start(); 
    } 
    // reader is a BufferedReader 
    while ((String line = reader.readLine()) != null) { 
     // put string to job queue 
     workCount++ 
    } 
    while(workCount) { 
     //result = get result from finished queue, and add it to results LinkedList 
     workCount--; 
    } 
    for (int i = 0; i < numThreads; i++) { 
     threads[i].canStop(); // this sets a private variable that makes infinite while loop to stop 
     threads[i].join(); 
    } 
    return results; 
} 

그러나 나는 어떤 종류의 큐 구현을 위해 이것을 사용하는지 혼란 스럽다. documentation은 11 가지 다른 종류의 큐 구현을 보여줍니다.

+0

새로운 Java 7 또는 8 기능입니까? 원시 제네릭? 정말? –

+0

이것은 Java 7입니다. 나는 정말 새롭고, 분명한 실수가 있다면 정말 미안합니다. – yasar

+0

이 코드가 컴파일됩니까? 나는 그것에 대한 어떤 언급도 찾을 수 없다. –

답변

1

ConcurrentLinkedQueue은 링크 된 노드를 기반으로 한 무한 스레드 안전 큐입니다.

이 많은 스레드가 공통의 컬렉션에 대한 액세스를 공유 적절한 선택이 될 것입니다하지만이 클래스가 null 요소의 사용을 허용하지 않습니다.

link은 멀티 스레딩에 사용할 수있는 다른 대기열 구현 간의 비교를 포함합니다.

0

많은 다른 스레드에서 대기열에 액세스하므로 java.util.concurrent의 대기열 구현 중 하나를 사용하는 것이 더 효율적일 수 있습니다. 다른 대기열에는 명시 적 동기화가 필요할 수 있습니다.

예를 들어 ArrayBlockingQueue을 시도하면 바운드 링 버퍼가 구현됩니다. 그것이 제한된다는 사실은 작업이 처리 될 수있는 것보다 빠르게 제출 될 때 자동으로 백 프레셔를 적용한다는 것을 의미합니다. 대기열은 메모리가 부족할 때까지 계속 증가하지 않습니다.

구현은 대부분 성능 특성이 다르며 다른 작업로드가 서로 다른 대기열에서 도움이 될 수 있습니다. 자신의 상황에 가장 적합한 옵션을 테스트해야합니다.

1

둘 이상의 스레드가 동일한 대기열에 액세스하는 경우 (실제로는 모두 BlockingQueue 구현 임에도 불구하고) Queue의 java.util.concurrent 구현이 권장됩니다. 읽기 전용 기능이라 할지라도 (그렇지 않으면 대기열에서 동일한 작업을 폴링하여 실행하는 두 개의 스레드가 발생할 위험이 있습니다). 즉, 사용자가 직접 액세스를 동기화 (및 동기화 테스트)에 많은 시간을 소비하지 않으려는 경우입니다.

그런 다음 선택 항목은 대기열에서 원하는 추가 기능에 따라 다릅니다. LinkedBlockingQueueArrayBlockingQueue의 차이점은 다양한 기본 작업 (삽입, 삭제, 선택 등)의 수행에 있습니다. PriorityBlockingQueue을 사용하면 자신의 조건에 따라 다른 작업과 비교하여 일부 작업을 "푸시"(우선 순위를 지정) 할 수 있습니다 (힙으로 구현되지만 그 점에 대해서는 언급하지 않음). DelayQueue은 이름에서 말하는대로 작동하여 일정 시간 동안 일부 작업을 지연시킬 수 있습니다.

이론상 동기화 된 (리소스를 기다리는) 기능보다 나은 "대기없는"알고리즘을 사용하므로 ConcurrentLinkedQueue을 좋아합니다.

또 다른 참고 사항 : 자신의 스레드 컬렉션을 관리하는 대신 Executor, ExecutorsExecutorService을 살펴 보시기 바랍니다.

관련 문제