이 기사는 주로 동시성과 관련된 컬렉션에 대해 이야기합니다. 일반 컬렉션은 [Java Collection Overview]를 참조하십시오.
1. Blockingqueue 가란 무엇입니까?
Blockingqueue는 차단 대기열입니다. 블로킹이라는 단어에서 블로킹 큐에 대한 액세스는 경우에 따라 막힘이 발생할 수 있음을 알 수 있습니다. 두 가지 주요 차단 된 사례가 있습니다.
1. 대기열이 가득 차면 큐가 듭니다.
2. 대기열이 비어 있으면 대기열에서 벗어납니다.
따라서 스레드가 이미 전체 대기열을 큐를 시도하면 다른 스레드가 큐 작동하지 않으면 차단됩니다. 마찬가지로, 스레드가 빈 대기열을 큐를 시도 할 때 다른 스레드에 큐 작동이 없으면 차단됩니다.
Java에서 Blockingqueue 인터페이스는 java.util.concurrent 패키지 (Java 5 버전으로 제공)에 있습니다. 위에서 도입 된 차단 큐의 특성으로부터, 차단 큐는 스레드 안전임을 알 수 있습니다.
2. Blockingqueue를 사용하는 방법
차단 대기열은 주로 생산자/소비자 시나리오에서 사용됩니다. 다음 그림은 스레드 프로덕션 및 스레드 소비 시나리오를 보여줍니다.
생산을 담당하는 스레드는 지속적으로 새로운 객체를 생성 하고이 대기열의 상한에 도달 할 때까지 블록 큐에 삽입합니다. 대기열이 상한에 도달하면 소비 된 스레드가 큐를 소비 할 때까지 생산 스레드가 차단됩니다. 마찬가지로, 소비를 담당하는 스레드는 대기열이 비어있을 때까지 큐에서 객체를 지속적으로 소비합니다. 대기열이 비어 있으면 큐의 새 개체가 삽입되지 않으면 소비 스레드가 차단됩니다.
3. Blockingqueue 인터페이스의 방법
insert , remove 및 examine 수행하기 위해 대기열을 차단하는 4 가지 세트가 있습니다. 각 메소드 세트에 해당하는 작업을 즉시 실행할 수없는 경우 반응이 다릅니다. 다음 표는 이러한 방법을 분류 된 방식으로 나열합니다.
| - | 예외를 던집니다 | 특별한 가치 | 블록 | 시간 밖으로 |
|---|---|---|---|---|
| 끼워 넣다 | 추가 (O) | 제안 (O) | put (o) | 제안 (O, 타임 아웃, 시간 유닛) |
| 제거하다 | 제거 (O) | 투표() | 가져가다() | 설문 조사 (타임 아웃, 시간 유닛) |
| 조사하다 | 요소() | 몰래 엿보다() |
이 네 가지 방법 세트의 해당 특성은 다음과 같습니다.
1. ThrowSexception : 작업을 즉시 수행 할 수 없으면 예외가 발생합니다.
2. SpecialValue : 작업을 즉시 수행 할 수없는 경우 특별 값이 반환되며 일반적으로 true 또는 false
3. 블록 : 작업을 즉시 수행 할 수없는 경우 작업이 차단됩니다.
4. Timesout : 작업을 즉시 수행 할 수없는 경우 지정된 시간에 작업이 차단됩니다. 지정된 시간이 실행되지 않으면 특수 값이 반환되며 일반적으로 true 또는 false입니다.
Blockingqueue에 null 삽입 할 수 없으며, 그렇지 않으면 NullPointerException 보고됩니다.
4. Blockingqueue 구현 클래스
Blockingqueue는 java.util.concurrent 패키지의 인터페이스 일뿐입니다. 구체적으로 사용할 때 구현 클래스를 사용합니다. 물론 이러한 구현 클래스는 java.util.concurrent 패키지에도 있습니다. Java 6에서는 Blockingqueue 구현 클래스가 주로 다음과 같습니다.
1. ArrayBlockingqueue
2. Delayqueue
3. LinkedBlockingqueue
4. PriorityBlockingqueue
5. 동기식
아래에서 이러한 구현 클래스를 개별적으로 소개합니다.
4.1 ArrayBlockingqueue
ArrayBlockingqueue는 경계 차단 큐이며 내부 구현은 배열입니다. 경계의 의미는 용량이 제한되어 있음을 의미하고 초기화 할 때 용량 크기를 지정해야하며, 일단 지정되면 용량 크기를 변경할 수 없습니다.
ArrayBlockingqueue는 데이터를 최초의 첫 번째 방식으로 저장합니다. 새로 삽입 된 물체는 꼬리이고 새로 이동 한 물체는 머리입니다. 다음은 ArrayBlockingqueue를 초기화하고 사용하는 예입니다.
blockingqueue queue = new arrayblockingqueue (1024); queue.put ( "1"); 개체 개체 = queue.take ();
4.2 Delayqueue
Delayqueue 블록은 내부 요소입니다. Delayque의 요소는 java.util.concurrent.Delayed 인터페이스를 구현해야합니다. 이 인터페이스의 정의는 매우 간단합니다.
공개 인터페이스 지연 연장 <지연> {Long GetDelay (TimeUnit Unit);} getDelay() 메소드의 반환 값은 큐 요소가 해제되기 전의 홀드 시간입니다. 0 또는负值반환되면 요소가 만료되어 해제해야 함을 의미합니다. 현재 Delayedqueue는 take() 메소드를 통해이 객체를 해제합니다.
위의 지연된 인터페이스 정의에서 볼 수 있듯이 Comparable 인터페이스도 상속합니다. 지연된 큐의 요소를 정렬해야하기 때문입니다. 일반적으로, 우리는 요소 만료 시간의 우선 순위에 따라 정렬합니다.
예 1 : 개체의 만료 시간을 지정하십시오
먼저 지연된 인터페이스를 구현 해야하는 요소를 정의합니다.
공공 계급 지연 예수 구현 지연 {private long 만료; 개인 장기 지연; 개인 문자열 이름; 지연 (String ElementName, Long Delay) {this. name = elementName; 이것. 지연 = 지연; 만료 = (Delay + System. currentTimEmillis ()); } @override public int compareto (지연 o) {DelayedElement cached = (DelayedElement) o; return cached.getexpired ()> 만료 된? 1 : -1; } @override public long getDelay (TimeUnit Unit) {return (orpried- system. currentTimeMillis ()); } @override public String toString () {return "DelayedElement [delay =" + delay + ", name =" + name + "]; } public long getexpired () {return 만료; }}이 요소의 만료 시간을 3s로 설정하십시오
Public Class DelayqueueExample {public static void main (String [] args)은 InterruptedException {Delayqueue <DelayedElement> queue = new Delayqueue <> (); 지연 요소 ELE = 새로운 지연 ( "캐시 3 초", 3000); queue.put (ele); 체계. out.println (queue.take ()); }}이 주요 기능을 실행하면이 개체를 인쇄하기 전에 3 초를 기다려야한다는 것을 알 수 있습니다.
실제로 Timed Closing Connections, 캐시 객체, 시간 초과 처리 및 기타 시나리오와 같은 Delayque에 대한 많은 응용 프로그램 시나리오가 있습니다. 학생 시험을 예로 들어 모든 사람이 Delayqueue의 사용을 더 깊이 이해할 수 있도록합시다.
예 2 : 시험의 모든 학생들을 지체로 대우하십시오.
먼저, 우리는 학생 대상을 구성합니다
공개 클래스 학생은 실행 가능하고 지연된 {개인 문자열 이름; // 프라이빗 프라이버시 긴 원가 시간; // 테스트 질문에 대한 시간 비공개 장기 완료 시간; // 완성을위한 시간 (문자열 이름, 긴 비용) {this. 이름 = 이름; 이것. Costtime = Costtime; 완성 된 시간 = CostTime + 시스템. CurrentTimeMillis (); } @override public void run () {시스템. out.println (이름 + "종이 제출, 시간 제출" + Costtime /1000); } @override public long getDelay (TimeUnit Unit) {return (완성기 - 시스템. currentTimeMillis ()); } @override public int compareto (지연 o) {학생 기타 = (학생) o; Costtime을 반환하십시오> = 기타. 비용 시간? 1 : -1; }}그런 다음 교사 대상을 구성하여 학생들에게 시험을 치르십시오.
공개 클래스 교사 {정적 최종 int 학생 _size = 30; public static void main (string [] args)은 중단 된 출시 {random r = new random (); // 모든 학생들을 지연 대기열 지연 Quelqueue <tudent> 학생 = 새로운 Delayqueue <학생> (); // 학생들이 "숙제를 할 수있게하는"실 for (int i = 0; i <student_size; i ++) {// 학생의 이름과 테스트 학생을 초기화합니다. } // while (! whitsing.isempty ()) {exec.execute (whitsing.take ()); } exec.shutdown (); }}실행중인 결과를 살펴 보겠습니다.
학생 2 논문 제출, 3
학생 1 종이에 손을 대고 5
학생 5 논문 제출, 7
학생 4 논문을 제출하고 8
학생 3 논문 제출, 11
실행 결과를 통해 각 학생이 지정된 시작 시간이 도착 한 후 ( getDelay () 메소드에 따라 다름 )가 "논문을 제출한다"는 것을 알 수 있으며, 논문은 먼저 ( compareto () 메소드에 따라 )를 제출합니다.
소스 코드를 살펴보면 Delayqueue의 내부 구현이 PriorityQueue와 잠금을 사용한다는 것을 알 수 있습니다.
4.3 LinkedBlockingqueue
LinkedBlockingqueue 차단 큐 크기의 구성은 선택 사항입니다. 초기화시 크기를 지정하면 경계가 지정되고 지정되지 않은 경우 제한됩니다. 무한한 것으로 알려져 있지만 실제로 기본 크기는 Integer.MAX_VALUE 입니다 .max_value 용량입니다. 내부 구현은 링크 된 목록입니다.
ArrayBlockingqueue와 마찬가지로 LinkedBlockingQueue는 데이터를 첫 번째로 처음으로 저장합니다. 새로 삽입 된 물체는 꼬리이고 새로 이동 한 물체는 머리입니다. 다음은 LinkedBlockingQueue를 초기화하고 만드는 예입니다.
blockingqueue <string> unbounded = new LinkedBlockingqueue <string> (); blockingqueue <string> bounded = new LinkedBlockingqueue <string> (1024); bounded.put ( "value"); String value = bounded.take ();
4.4 PriorityBlockingqueue
PriorityBlockingqueue는 경계가없는 대기열이며 정렬 규칙은 java.util.PriorityQueue 와 동일합니다. NULL 객체는 PriorityBlockingQueue에 삽입 될 수 있습니다.
PriorityBlockingqueue에 삽입 된 모든 객체는 java.lang.Comparable 인터페이스를 구현해야하며 큐 우선 순위 정렬 규칙은이 인터페이스의 구현에 따라 정의됩니다.
또한 PriorityBlockingQueue에서 반복자를 얻을 수 있지만이 반복은 우선 순위로 반복을 보장하지 않습니다.
예를 들어 설명해 봅시다. 먼저 비슷한 인터페이스를 구현 해야하는 객체 유형을 정의합니다.
공개 클래스 우선 순위는 비교할 수있는 <우선 순위 우선 순위; // 우선 순위 우선 순위 (int priority) 정의 {// 우선 순위 초기화 this.priority = priority;}@atederidepublic int compareto (priorityElement o) {// 우선 순위 크기에 의한 정렬> = o.getPriority ()? 1 : -1;} public int getPriority () {return priority;} public void setPriority (int priority) {this.priority = priority;}@atriadepublic string toString () {priorityElement [priority = " + priority +"];}}그런 다음 우리는 무작위로 대기열에 우선 순위를 설정합니다
public class priorityblockingqueueexample {public static void main (String [] args)은 인터럽트 exception {priorityBlockingQueue <PriorityElement> queue = 새로운 priorityBlockingQueue <> (); for (int i = 0; i <5; i ++) {random random = new random (); PriorElement ele = 새로운 우선 순위 (random.nextInt (10)); queue.put (ele); } while (! queue.isempty ()) {system.out.println (queue.take ()); }}}실행 결과를 확인하십시오.
우선 순위 [우선 순위 = 3]
우선 순위 [우선 순위 = 4]
우선 순위 [우선 순위 = 5]
우선 순위 [우선 순위 = 8]
우선 순위 [우선 순위 = 9]
4.5 동기식
동기식 큐 내부에는 하나의 요소 만 허용됩니다. 스레드가 요소를 삽입하면 요소가 다른 스레드에 의해 소비되지 않으면 차단됩니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.