큐 인터페이스는 목록 및 세트와 동일한 수준이며 컬렉션 인터페이스를 상속합니다. LinkedList는 큐 인터페이스를 구현합니다. 큐 인터페이스는 LinkedList 메소드에 대한 액세스를 좁히고 (즉, 메소드의 매개 변수 유형이 큐인 경우 큐 인터페이스에 의해 정의 된 메소드에만 액세스 할 수 있으며 링크 사전 목록의 비 queue 메소드에 직접 액세스 할 수 없으므로 적절한 메소드 만 사용할 수 있습니다. Blockingqueue는 큐 인터페이스를 상속합니다.
큐는 데이터 구조입니다. 큐 끝에 요소를 추가하고 대기열의 헤드에서 요소를 제거하면 큐가 첫 번째 최초의 방식으로 데이터를 관리한다는 것을 의미합니다. 전체 차단 큐에 요소를 추가하거나 빈 차단 대기열에서 메타 렉터를 제거하려고하면 스레드가 차단됩니다. 큐 차단은 여러 스레드와 협력 할 때 유용한 도구입니다. 작업자 스레드는 정기적으로 중간 결과를 차단 대기열에 저장할 수 있으며 다른 작업자 스레드는 중간 결과를 가져 와서 향후 수정할 수 있습니다. 큐는 자동으로 부하의 균형을 유지합니다. 첫 번째 스레드 세트가 두 번째 스레드보다 느리게 실행되면 두 번째 스레드 세트가 결과를 기다리는 동안 차단됩니다. 첫 번째 스레드 세트가 빠르게 실행되면 두 번째 스레드 세트가 따라 잡을 때까지 기다립니다. 다음 표는 JDK1.5에서 차단 큐의 작동을 보여줍니다.
큐가 가득 찬 경우 metaSearch 추가 추가 IIIEGAISLABEEPEPLIAN EXCERS를 던지십시오.
제거하고 큐 헤드의 요소를 제거하고 반환하십시오. 대기열이 비어 있으면 NosuchelementException 예외가 발생합니다.
요소는 큐 헤드에서 요소를 반환합니다. 대기열이 비어 있으면 NosuchelementException 예외가 발생합니다.
제안 요소 추가 및 큐가 가득 찬 경우 True를 반환합니다.
폴링은 큐 헤드의 요소를 제거하고 반환합니다. 대기열이 비어 있으면 NULL을 반환하십시오.
엿보기 큐 헤드의 요소를 반환합니다. 대기열이 비어 있으면 NULL을 반환하십시오
대기열이 가득 차면 요소를 추가하여 차단하십시오.
제거하고 큐 헤드의 요소를 반환하십시오. 대기열이 비어 있으면 차단됩니다
제거, 요소, 제안, 설문 조사 및 엿보기 실제로 큐 인터페이스에 속합니다.
블록 대기열은 응답에 따라 다음 세 가지 범주로 나눌 수 있습니다. AAD, Remoge 및 요소 작업은 전체 큐에 요소를 추가하거나 빈 줄에서 요소를 얻으려고 할 때 예외를 제외합니다. 물론, 멀티 스레드 프로그램에서는 큐가 언제든지 가득 차 있거나 비어있을 수 있으므로 제안, 폴링, 엿보기 방법을 사용할 수 있습니다. 이러한 방법은 예외를 던지지 않고 작업을 완료 할 수없는 경우 오류 메시지를 제공합니다.
참고 : 설문 조사 및 엿보기 메소드 오류 및 반환 NULL. 따라서 큐에 널 값을 삽입하는 것은 불법입니다.
예를 들어 다음 호출과 같은 타임 아웃이있는 제안 및 설문 조사 방법 변형도 있습니다.
부울 성공 = Q.Offer (x, 100, TimeUnit.milliseconds);
큐의 꼬리에 요소를 100 밀리 초 안에 삽입하십시오. 성공하면 즉시 참으로 반환하십시오. 그렇지 않으면 타임 아웃에 도달하면 False를 반환하십시오. 마찬가지로 전화 :
Object Head = Q.poll (100, TimeUnit.milliseconds);
큐 헤더 요소가 100 밀리 초 이내에 성공적으로 제거되면 헤더 요소가 즉시 반환됩니다. 그렇지 않으면 시간 초과에 도달하면 NULL이 반환됩니다.
마지막으로, 우리는 차단 작업을하고 가져 가고 있습니다. 풋 메서드는 큐가 가득 차면 차단되고 대기열이 비어있을 때 테이크 메소드가 차단됩니다.
java.ulil.concurrent 패키지는 차단 대기열의 4 가지 변형을 제공합니다. 기본적으로 LinkedBlockingQueue의 용량은 상한이 아닙니다 (정확하지 않습니다. 용량은 정수입니다. 지정되지 않은 경우 Max_value. 그렇지 않은 경우, 풋내야 할 때 어떻게 차단할 수 있습니까?) 최대 용량을 지정할 수도 있습니다. 링크 된 목록을 기반으로 한 대기열은 FIFO (첫 번째 첫 번째)로 요소를 정렬합니다.
ArrayBlockingqueue는 시공 중에 용량을 지정해야하며 공정성이 필요한지 여부를 선택할 수 있습니다. 공정 매개 변수가 True가 설정되면 대기 시간이 가장 긴 스레드가 먼저 처리됩니다 (실제로이 공정성은 ReentrantLock을 True로 설정하여 달성됩니다. 즉, 대기 시간이 가장 긴 스레드가 먼저 작동합니다). 일반적으로 공정성은 성능 비용이 들고 실제로 필요한 경우에만 사용할 수 있습니다. FIFO (첫 번째 첫 번째) 원칙에 따라 요소를 정렬하는 배열 기반 차단 루프 큐입니다.
PriorityBlockingqueue는 최초의 첫 번째 대기열이 아닌 우선 순위가있는 대기열입니다. 요소는 우선 순위 순서로 제거되고 큐는 상한이 없습니다 (소스 코드를 보았습니다. 우선 순위 블로킹 Queue는 힙 데이터 구조를 기반으로하는 우선 순위의 재 랩핑입니다. 우선 순위는 Arraylist와 마찬가지로 용량 제한이 없으므로 우선 순위를 차단할 때 차단할 수는 없지만이 큐는 물론 덧붙일 수 있습니다. OutofMemoryError 자원이 소진되어 있기 때문에), 큐가 비어 있으면 요소의 작업이 차단되므로 검색 작업이 차단됩니다. 또한 대기열에 들어가는 요소에는 비교 기능이 있어야합니다.
마지막으로, Delayqueue (PriorityQueue를 기반으로 구현)는 지연 요소를 저장하는 무한한 차단 큐이며, 지연이 만료 될 때만 요소를 추출 할 수 있습니다. 이 대기열의 헤드는 지연이 만료 된 후 가장 긴 저장 시간을 가진 지연 요소입니다. 지연이 만료되지 않은 경우, 대기열에는 헤더가없고 설문 조사에 NULL이 반환됩니다. 요소의 getDelay (TimeUnit.NanoSeconds) 방법이 0보다 작거나 같은 값을 반환하면 만료가 발생하고 폴링이 요소를 제거합니다. 이 대기열은 널 요소를 허용하지 않습니다. 지연 인터페이스는 다음과 같습니다.
자바 코드
공용 인터페이스 지연은 비슷한 <지연> {Long GetDelay (TimeUnit Unit); }Delayqueue를 넣는 요소는 또한 비교 방법을 구현하여 요소를 정렬하는 데 사용합니다.
다음 예제는 차단 큐를 사용하여 스레드 세트를 제어하는 방법을 보여줍니다. 이 프로그램은 하나의 디렉토리 및 모든 하위 디렉토리의 모든 파일을 검색하고 지정된 키워드가 포함 된 파일 목록을 인쇄합니다. 다음 예제에서 알 수 있듯이 차단 큐를 사용하면 두 가지 중요한 이점은 다음과 같습니다. 일반 대기열의 다중 스레드 작업에는 추가 동기화가 필요하지 않습니다. 또한, 큐는 부하의 균형을 자동으로 균형을 유지합니다. 즉, 처리 (생산 및 소비의 양쪽)가 빠르게 처리되면 차단하여 양쪽 간의 처리 속도 간격이 줄어 듭니다. 다음은 특정 구현입니다.
자바 코드
public class blockingqueuetest {public static void main (String [] args) {scanner in = new Scanner (System.In); System.out.print ( "기본 디렉토리 입력 (예 : /usr/local/jdk5.0/src) :"); 문자열 디렉토리 = in.nextline (); System.out.print ( "키워드 입력 (예 : 휘발성) :"); 문자열 키워드 = in.nextline (); 최종 int file_queue_size = 10; // 큐 크기 차단 최종 int search_threads = 100; // 키워드 검색 스레드 수 // arrayblockingqueueblockingqueue <file> queue를 기반으로 큐 차단 <file_queue_size); // 디렉토리를 검색하려면 하나의 스레드 만 시작하여 fileEnumerationTask Enumerator = new FileEnumerationTask (Queue, new File (directory)); 새 스레드 (Enumerator) .start (); // 파일에서 지정된 키워드를 검색하기 위해 100 스레드를 시작합니다 (int i = 1; i <= search_threads; i ++) 새 스레드 (new SearchTask (queue, keyword)). start (); }} class fileEnumerationTask는 실행 가능 {// 멍청한 메타 파일 객체가 차단 큐의 끝에 배치되어 파일이 공개 정적 파일을 가로 지르 셨음을 나타냅니다. 개인 블록 큐어 <파일> 대기열; 개인 파일 시작 디렉토리; public fileEnumerationTask (Blockingqueue <file> 큐, 파일 시작 디렉토리) {this.queue = 큐; this.startingdirectory = 시작 디렉토리; } public void run () {try {enumerate (statgerDirectory); queue.put (dummy); // 지정된 디렉토리의 파일이 트래버스} 캐치 (InterpruptedException e) {}} // 지정된 디렉토리의 모든 파일을 파일 객체 공개 void enumental (파일 디렉토리)에 방해받지 않은 {{}} // 지정된 디렉토리의 모든 파일을 방해받지 않은 예고 (] 파일 = directory .listory (listory)에 넣습니다. for (파일 : 파일) {if (file.isdirectory ()) 열거 (파일); else // 요소를 대기열 끝에 넣습니다. 대기열이 가득 찬 경우 큐를 블록 큐 (파일); }}} Class SearchTask는 실행 가능한 {private blockingqueue <file> 큐; 개인 문자열 키워드; public searchTask (blockingqueue <file> 큐, 문자열 키워드) {this.queue = queue; this.keyword = 키워드; } public void run () {try {boolean done = false; while (! done) {// 큐의 첫 번째 요소를 가져옵니다. 큐가 비어 있으면 파일 파일 = queue.take (); if (file == FileEnumerationTask.dummy) {// 가져 와서 다른 스레드가 queue.put (file)을 읽을 때 빠르게 끝나도록 넣습니다. 완료 = 참으로; } else 검색 (파일); }} catch (ioexception e) {e.printstacktrace (); } catch (InterruptedException e) {}} public void search (파일 파일) IoException {scanner in = new Scanner (new FileInputStream (file)); int linenumber = 0; while (in.hasnextline ()) {linenumber ++; 문자열 line = in.nextline (); if (line.contains (keyword)) system.out.printf ( "%s :%d :%s%n", file.getpath (), linenumber, line); } in.close (); }} 원본 링크 : http://www.cnblogs.com/end/archive/2012/10/25/2738493.html
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.