임무를 스레드 탱크에 제출하고 스레드 탱크에서 스레드를 분배하고 임무를 운행하며 현재 스레드가 끝난 후에 다시 스레드를 복원한다.
스레드 풀을 가져오려면:
상용 스레드 탱크 인터페이스와 클래스: (패키지 자바.util.concurrent)
Executor: 스레드 풀의 최상위 인터페이스
ExecutotService: 스레드 풀 인터페이스로 방법submit(Runnable task)을 통해 작업 코드를 제출할 수 있습니다.
Executors 공장 종류: 이런 것을 통해 하나의 스레드 탱크를 얻을 수 있다.newFixedThreadPool(int nThread)을 통해 고정된 수량의 스레드 풀을 가져옵니다.newCachedThreadPool()을 통해 동적 수량의 스레드 풀을 얻을 수 있으며, 충분하지 않으면 새로운 스레드 풀을 만들 수 있습니다. 상한선이 없습니다(Integer.MAX VALUE)
Callable 커넥터
publicinterfaceCallable<V>{
public V call()throws Exception;}
Runnable 인터페이스와 유사하며 실행 가능한 작업을 선언합니다.그러나 Callable에는 일반 반환 값이 있고 예외를 선언할 수 있습니다. Future 인터페이스
개념: 비동기 수신 Exception 서비스.submit () 가 되돌아오는 상태 결과,call 방법의 되돌아오는 값이 포함되어 있습니다.
Future<Integer> result1 = es.submit(task1);
방법: V get()은Future의 비동기 처리 결과(call()의 반환값을 막는 형식으로 기다린다
Integer value1 = result1.get();
동기식 및 비동기식:
동기화: 한 번의 방법이 호출되고 동기화가 시작되면 호출자는 이 방법이 되돌아오기를 기다려야 계속할 수 있다.(단일 실행 경로)
비동기: 한 번의 방법이 호출되고 비동기가 일단 시작되면 마치 한 번의 메시지 전달처럼 호출자가 알려주면 바로 되돌아온다. 양자는 시간영화를 경쟁하고 동시에 집행한다.(다중 실행 경로)
자물쇠를 받은 라인이 운행 기간에 이상이 발생하여 프로그램이 종료되는 것을 피하기 위해 자물쇠를 풀지 않았습니다!try{}finally{}를 사용하면 정확하게 실행하든 안 하든 최종적으로 자물쇠를 풀 수 있습니다!
읽기 및 쓰기 자물쇠
ReentrantReadWriteLock은 Lock 인터페이스의 실현 클래스가 아닙니다. Lock 인터페이스로 이 클래스의 대상을 가리킬 수 없습니다. 이것은 쓰기와 쓰기를 지원하는 동기화 자물쇠입니다. 읽기와 쓰기가 분리되어 각각 읽기 자물쇠, 쓰기 자물쇠를 분배할 수 있습니다.여러 읽기 잠금을 여러 번 할당하여 동시에 실행할 수 있도록 지원
인터페이스가 통일되고 유지보수성이 높지만 성능이 향상되지 않아서synchronized로 실현되었다 CopyOnWriteArrayList
안전한 라인의 Array List로 판독과 쓰기의 분리를 강화합니다.(읽기와 쓰기가 서로 다르지 않음)
자물쇠가 적혀 있고 읽기에 자물쇠가 없으며 읽기와 쓰기 사이가 막히지 않아 독서 자물쇠보다 우수하다.기록할 때, 용기 복사본을 복사한 다음, 편지 요소를 추가하고, 마지막으로 인용을 대체합니다.ArrayList와 동일한 방식으로 작동합니다.
내부 프로세스: 쓰기 작업에 자물쇠가 있어서 매번 쓰기를 할 때마다 밑바닥 그룹을 복제했다. 새 그룹을 쓴 다음에 값을 부여한 후에 새 그룹을 낡은 그룹으로 교체하고 호출할 때마다 밑바닥 방법은 한 번 확장한다.읽기 동작을 잠그지 않고 읽는 것은 쓰기 작업이 끝나기 전의 낡은 그룹을 다 쓴 후에야 읽을 수 있는 새 그룹의 새 값입니다.
CopyOnWriteArraySet
라인이 안전한 Set, 밑바닥은 CopyOnWriteArrayList로 이루어집니다.
쓰기 표면에는dd 방법을 사용하고 밑바닥은CopyOnWriteArrayList의addIfAbsent()를 사용하여 삽입할 새 값이 존재하는지 판단합니다.
원소가 존재하면 추가하지 않습니다(던전 버리기).
ConcurrentHashMap
초기 용량 기본 16세그먼트(Segment), 세그먼트 잠금 디자인을 사용합니다.
전체 맵에 자물쇠를 채우지 않고 각각의 Segment에 자물쇠를 채웁니다(자물쇠는 헤더 대상입니다).
여러 객체가 동일한 Segment에 저장될 때 상호 배척이 필요합니다.
가장 이상적인 상태는 16개의 대상이 각각 16개의 Segment에 저장되고 병렬 수량은 16이다.
사용 방식은 해시맵과 다름없다.
Queue 커넥터(대기열)
Collection 하위 인터페이스, 대기열 FIFO(First In First Out)
상용 방법: 이상 던지기:
boolean add(E e)// ( , )
E remove()// ( , )
E element()// ( , )
특수값 반환: (권장)
boolean offer(E e)// ( , false)
E poll()// ( , null)
E keep() // ( , null)
ConcurrentLinkedQueue
라인이 안전하고 효율적으로 읽기와 쓰기가 가능한 대기열로 성능이 가장 좋은 대기열을 보냅니다.
잠금 없음, CAS 비교 교환 알고리즘, 수정 방법은 세 가지 핵심 매개 변수(V, E, N)를 포함한다.
V: 업데이트할 변수 E: 예상 값 N: 새 값.
V=E일 때만 V=N;그렇지 않으면 업데이트되었음을 표시하고 현재 작업을 취소합니다.
BlockingQueue 인터페이스(대기열 차단)
Queue의 하위 인터페이스, 막힌 대기열, 두 개의 스레드 상태를 무기한 대기하는 방법을 추가했습니다.
방법:
voidput(E e)// , ,
E take()// , ,
생산자, 소비자 문제 해결에 사용
막힌 대기열의 두 가지 실현 유형:
ArrayBlockingQueue: 그룹 구조가 실현되고 경계 대기열이 있습니다.(수동 고정 상한)