English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
이 튜토리얼에서는 예제를 통해 LinkedBlockingQueue 클래스 및 메서드를 배울 것입니다.
Java Collections 프레임워크의 LinkedBlockingQueue 클래스는 링크드 리스트를 사용하여 블록된 큐 구현을 제공합니다.
이를 통해 구현됩니다Java BlockingQueue 인터페이스.
링크드 블록 큐를 생성하려면 java.util.concurrent.LinkedBlockingQueue 패키지를 가져오는 것이 필요합니다.
이렇게 Java에서 링크드 블록 큐를 생성하는 방법입니다:
1. 초기 용량 없음
LinkedBlockingQueue<Type> animal = new LinkedBlockingQueue<>();
이곳에서, 초기 용량은 기본적으로2 31 -1.
2. 초기 용량을 가지고 있습니다
LinkedBlockingQueue<Type> animal = new LinkedBlockingQueue<>(int capacity);
이곳에서
형식 - 링크드 블록 큐의 형식
용량 - 링크드 블록 큐의 크기
예를 들어,
//크기가5의 문자형 LinkedBlockingQueue LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>();5); //크기가5의 정수형 LinkedBlockingQueue LinkedBlockingQueue<Integer> age = new LinkedBlockingQueue<>();5);
주의:리스트의 크기는 필수가 아닙니다.
LinkedBlockingQueue 클래스는 제공합니다BlockingQueue 인터페이스모든 메서드의 구현.
이 메서드들은 링크드 블록 큐에서 요소를 삽입, 접근 및 제거하는 데 사용됩니다.
또한, put(), take()라는 두 가지 메서드를 배울 것입니다. 이들은 링크드 블록 큐의 블록된 연산을 지원합니다.
이 두 가지 메서드는 링크드 블록 큐를 다른 표준 큐와 구분합니다.
add()를 사용하여 - 지정된 요소를 링크드 블록 큐에 삽입합니다. 큐가 가득 차면 예외를 발생시킵니다.
offer()를 사용하여 - 지정된 요소를 링크드 블록 큐에 삽입합니다. 큐가 가득 차면 false를 반환합니다.
예를 들어,
import java.util.concurrent.LinkedBlockingQueue; class Main { public static void main(String[] args) { LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>();5); // add()를 사용하여 animals.add("Dog"); animals.add("Cat"); // offer()를 사용하여 animals.offer("Horse"); System.out.println("LinkedBlockingQueue: ", + animals); } }
출력 결과
LinkedBlockingQueue: [Dog, Cat, Horse]
peek() - 링크드 블록 큐의 앞쪽에서 요소를 반환합니다. 큐가 비어 있으면 null을 반환합니다.
iterator() - 이터레이터 객체를 반환하여 링크드 블록 큐의 요소를 순서대로 접근할 수 있습니다. 큐가 비어 있으면 예외가 발생합니다. 이터레이터를 사용하려면 java.util.Iterator 패키지를 가져오는 것이 필요합니다.
예를 들어,
import java.util.concurrent.LinkedBlockingQueue; import java.util.Iterator; class Main { public static void main(String[] args) { LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>();5); //요소 추가 animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("LinkedBlockingQueue: ", + animals); // peek() 사용 String element = animals.peek(); System.out.println("요소 접근: " + element); // iterator() 사용 Iterator<String> iterate = animals.iterator(); System.out.print("LinkedBlockingQueue 요소: "); while(iterate.hasNext()) { System.out.print(iterate.next()); System.out.print(", "); } } }
출력 결과
LinkedBlockingQueue: [Dog, Cat, Horse] 요소 접근: Dog LinkedBlockingQueue 요소: Dog, Cat, Horse,
remove() - 지정된 요소를 반환하고 리스트 블록 큐에서 제거합니다. 팀이 비어 있다면 예외를 던집니다。
poll() - 지정된 요소를 반환하고 리스트 블록 큐에서 제거합니다. 팀이 비어 있다면 null을 반환합니다。
clear() - 리스트 블록 큐에서 모든 요소를 제거합니다。
예를 들어,
import java.util.concurrent.LinkedBlockingQueue; class Main { public static void main(String[] args) { LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>();5); animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("LinkedBlockingQueue " + animals); // remove() 사용 String element1 = animals.remove(); System.out.println("요소 제거:"); System.out.println("remove() 사용: " + element1); // poll() 사용 String element2 = animals.poll(); System.out.println("poll() 사용: " + element2); // clear() 사용 animals.clear(); System.out.println("更新된LinkedBlockingQueue " + animals); } }
출력 결과
LinkedBlockingQueue: [Dog, Cat, Horse] 요소 제거: remove() 사용: Dog poll() 사용: Cat 更新된LinkedBlockingQueue: []
다중 스레드 과정에서, 우리는 put()과 take()를 사용하여 스레드를 블록하여 다른 스레드와 동기화할 수 있습니다. 이 메서드는 성공적으로 실행할 수 있을 때까지 기다립니다.
지정된 요소를 링크드 블록 큐의 마지막에 삽입하려면 put() 메서드를 사용합니다.
만약 링크드 블록 큐가 가득 찬 경우, 그것은 요소를 삽입할 공간이 링크드 블록 큐에 들어올 때까지 기다립니다.
예를 들어,
import java.util.concurrent.LinkedBlockingQueue; class Main { public static void main(String[] args) { LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>();5); try { //elements에 요소 추가 animals.put("Dog"); animals.put("Cat"); System.out.println("LinkedBlockingQueue: ", + animals); } catch(Exception e) { System.out.println(e); } } }
출력 결과
LinkedBlockingQueue: [Dog, Cat]
여기서, 기다리는 중에 중단되면 put() 메서드는 InterruptedException를 표시할 수 있습니다. 따라서, 우리는 그것을 포함해야 합니다.try..catch 블록에서.
링크드 블록 큐의 앞쪽에서 요소를 반환하고 제거하려면 take() 메서드를 사용할 수 있습니다.
만약 링크드 블록 큐가 비어 있으면, 그것은 제거할 요소가 링크드 블록 큐에 들어올 때까지 기다립니다.
예를 들어,
import java.util.concurrent.LinkedBlockingQueue; class Main { public static void main(String[] args) { LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>();5); try { //elements에 요소 추가 animals.put("Dog"); animals.put("Cat"); System.out.println("LinkedBlockingQueue: ", + animals); //요소 제거 String element = animals.take(); System.out.println("요소 제거: ", + element); System.out.println("새로운 LinkedBlockingQueue: ", + animals); } catch(Exception e) { System.out.println(e); } } }
출력 결과
LinkedBlockingQueue: [Dog, Cat] 요소 제거: [Dog] 새로운 LinkedBlockingQueue: [Cat]
여기서, 기다리는 중에 중단되면 take() 메서드는 InterruptedException를 표시합니다. 따라서, 우리는 그것을 try...catch 블록 내에 감싸야 합니다.
메서드 | 콘텐츠 설명 |
---|---|
contains(element) | 링크드 블록퀸 퀸에서 지정된 요소를 검색합니다. 요소가 발견되면 true를 반환하고, 발견되지 않으면 false를 반환합니다. |
size() | 링크드 블록퀸 퀸의 길이를 반환합니다. |
toArray() | 링크드 블록퀸 퀸을 배열로 변환하고 해당 배열을 반환합니다. |
toString() | 링크드 블록퀸 퀸을 문자열로 변환하려면 |
LinkedBlockingQueue는 내부 저장소로 링크드 라이스를 사용합니다.
이는 다음과 같이 간주됩니다스레드 안전콜렉션입니다. 따라서, 이는 보통 멀티 스레드 애플리케이션에서 사용됩니다.
한 스레드가 요소를 큐에 삽입하고 다른 스레드가 큐에서 요소를 제거하는 경우를 가정해 보겠습니다.
현재, 첫 번째 스레드가 두 번째 스레드보다 느리다면, 링크드 블록퀸 퀸이 두 번째 스레드를 기다리게 할 수 있습니다. 첫 번째 스레드가 그 작업을 완료할 때까지.