자바 스 레 드 병행 도구 류 CountDownlatch 원리 및 용법
[1]Countdown Latch 가 뭐 예요?
Countdown Latch 는 카운트다운 잠 금 장치 로 번역 되 며 동기 화 보조 클래스 입 니 다.다른 스 레 드 에서 실행 중인 작업 이 완료 되 기 전에 하나 또는
여러 스 레 드 가 기다 리 고 있 습 니 다.
잠 금 을 닫 으 면 스 레 드 의 진 도 를 지연 시 킬 수 있 습 니 다.잠 금 을 닫 으 면 다른 활동 이 완 료 될 때 까지 계속 실행 할 수 있 습 니 다.
4.567917.특정한 계산 이 필요 한 모든 자원 이 초기 화 된 후에 야 계속 실 행 될 수 있 도록 확보한다4.567917.특정한 서비스 가 의존 하 는 모든 다른 서비스 가 시 작 된 후에 야 시작 하도록 확보한다4.567917.특정한 조작 에 참여 한 모든 참여 자가 준비 가 다 될 때 까지 기 다 렸 다가 계속 집행 한다Countdown Latch 는 양수 계수 기 를 가지 고 있 습 니 다.countDown()방법 은 계수 기 를 줄 이 고 await()방법 은 계수 기 를 0 까지 기다 리 고 있 습 니 다.모든 await 스 레 드 는 카운터 가 0 이거 나 스 레 드 가 중단 되 거나 시간 이 초 과 될 때 까지 막 힙 니 다.
폐쇄(카운트다운 자물쇠)는 주로 어떤 임 무 를 완성 하 는 선 결 조건 을 만족 시 키 는 데 쓰 인 다.여러 스 레 드 간 의 동기 화 를 조정 하 는 동기 화 도구 클래스 입 니 다.이 도 구 는 보통 스 레 드 기다 림 을 제어 하 는 데 사 용 됩 니 다.카운트다운 이 끝 날 때 까지 스 레 드 를 기다 리 게 하고 실행 을 시작 할 수 있 습 니 다.
[2]Countdown Latch 의 두 가지 전형 적 인 용법
① 특정한 스 레 드 가 실행 되 기 전에 n 개의 스 레 드 가 실 행 될 때 까지 기다린다.
Countdown Latch 의 계수 기 를 n:new Countdown Latch(n)로 초기 화 합 니 다.작업 스 레 드 가 실 행 될 때마다 계수 기 를 1 countdownlatch.countDown()줄 이 고 카운터 의 값 이 0 으로 변 할 때마다 Countdown Latch 에서 await()의 스 레 드 가 깨 어 납 니 다.하나의 전형 적 인 응용 장면 은 서 비 스 를 시작 할 때 메 인 스 레 드 는 여러 구성 요소 가 불 러 올 때 까지 기 다 렸 다가 계속 실행 해 야 한 다 는 것 이다.
② 여러 스 레 드 에서 작업 을 시작 하 는 최대 병행 성 을 실현 합 니 다.
주 의 는 병행 성 입 니 다.병발 이 아니 라 여러 스 레 드 가 어느 순간 에 동시에 실행 되 는 것 을 강조 합 니 다.달리기 와 비슷 하 게 여러 라인 을 기점 에 놓 고 신호총 이 울 리 기 를 기다 린 뒤 동시에 달린다.공 유 된 CountDownlatch 대상 을 초기 화하 고 계수 기 를 1:new CountDownlatch(1)로 초기 화 합 니 다.여러 스 레 드 가 작업 을 시작 하기 전에 먼저 coundownlatch.awat()를 시작 합 니 다.주 스 레 드 가 countDown()을 호출 할 때 계수 기 는 0 으로 바 뀌 고 여러 스 레 드 가 동시에 깨 어 납 니 다.
다음 과 같은 예 에서 보 듯 이 다 중 스 레 드 가 운행 하 는 상황 에서 다 중 스 레 드 가 소모 하 는 시간 을 계산한다.
public class TestCountDownLatch {
//CountDownLatch 、
static CountDownLatch countDownLatch = new CountDownLatch(5);
static class LatchDemo extends Thread{
@Override
public void run() {
int sum = 0;
for (int i = 0; i < 1000000; i++) {
sum++;
}
System.out.println(getName()+" :"+sum);
countDownLatch.countDown();
}
}
public static void main(String[] args) throws InterruptedException {
long begin = System.currentTimeMillis();
System.out.println(" -----"+begin);
for (int i = 0; i < 5; i++) {
new LatchDemo().start();
}
countDownLatch.await();
long end = System.currentTimeMillis();
System.out.println(" -----"+end);
System.out.println(" :"+(end-begin));
}
}
/**
-----1571144894551
Thread-3 :1000000
Thread-0 :1000000
Thread-1 :1000000
Thread-2 :1000000
Thread-4 :1000000
-----1571144894559
:8
*/
2.CyclicBarrier[1]Cyclic Barrier 가 뭐 예요?
Cyclic Barrier 는 울타리 류 로 Count Downlatch 와 유사 합 니 다.그것 은 어떤 사건 이 발생 할 때 까지 스 레 드 를 막 을 수 있다.울타리 와 폐쇄 의 관건 적 인 차 이 는 모든 스 레 드 가 동시에 울타리 위치 에 도착 해 야 계속 실 행 될 수 있다 는 점 이다.
Cyclic Barrier 는 일정 수량의 스 레 드 를 울타리 위치 에서 반복 적 으로 모 을 수 있 습 니 다.스 레 드 가 울타리 위치 에 도 착 했 을 때 await 방법 을 사용 합 니 다.이 방법 은 모든 스 레 드 가 울타리 위치 에 도착 할 때 까지 차단 합 니 다.모든 스 레 드 가 울타리 위치 에 도착 하면 울타리 가 열 립 니 다.이 때 모든 스 레 드 가 풀 리 고 울 타 리 는 다음 에 사용 할 수 있 도록 초기 화 됩 니 다.
[2]CyclicBarrier 구조 방법
public CyclicBarrier(int parties) {
this(parties, null);
}
public CyclicBarrier(int parties, Runnable barrierAction) {
if (parties <= 0) throw new IllegalArgumentException();
this.parties = parties;
this.count = parties;
this.barrierCommand = barrierAction;
}
Cyclicbarrier 의 기본 구조 방법 은 Cyclicbarrier(int parties)입 니 다.그 매개 변 수 는 장벽 이 차단 하 는 스 레 드 수량 을 표시 합 니 다.모든 스 레 드 는 await()방법 으로 Cyclicbarrier 에 게 제 가 이미 장벽 에 도 착 했 음 을 알려 주 고 현재 스 레 드 가 막 혔 습 니 다.Cyclicbarrier 의 또 다른 구조 함수 Cyclicbarrier(int parties,Runnable barrierAction)는 스 레 드 가 장벽 에 도 착 했 을 때 barrierAction 을 우선 실행 하여 더욱 복잡 한 업무 장면 을 처리 하 는 데 편리 합 니 다.
【3】CyclicBarrier 응용 예시
public class CyclicBarrierTest {
//
private static class Worker extends Thread {
private CyclicBarrier cyclicBarrier;
public Worker(CyclicBarrier cyclicBarrier) {
this.cyclicBarrier = cyclicBarrier;
}
@Override
public void run() {
super.run();
try {
System.out.println(Thread.currentThread().getName() + " ");
cyclicBarrier.await();
System.out.println(Thread.currentThread().getName() + " ");
// , Thread.sleep()
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + " ");
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
int threadCount = 3;
CyclicBarrier cyclicBarrier = new CyclicBarrier(threadCount);
for (int i = 0; i < threadCount; i++) {
System.out.println(" " + i);
Worker worker = new Worker(cyclicBarrier);
worker.start();
}
}
}
/**
0
1
Thread-0
2
Thread-1
Thread-2
Thread-2
Thread-0
Thread-1
Thread-1
Thread-0
Thread-2
*/
위 코드 에서 사용자 정의 작업 스 레 드 는 모든 참여 스 레 드 가 시 작 된 후에 야 실 행 될 수 있 습 니 다.저 희 는 Cyclic Barrier 류 를 사용 하여 완성 할 수 있 습 니 다.프로그램의 실행 결과 에서 도 알 수 있 듯 이 모든 작업 스 레 드 가 await()방법 을 실행 한 후에 울타리 위치 에 도착 한 후에 야 3 개의 작업 스 레 드 가 업무 처 리 를 시작 했다.[4]Cyclic Barrier 와 Count Downlatch 의 차이
[1]Semaphore 가 뭐 예요?
신 호 량(Semaphore)은 신호등 이 라 고도 불 리 며 다 중 스 레 드 환경 에서 각 스 레 드 를 조율 하여 공공 자원 을 정확 하고 합 리 적 으로 사용 할 수 있 도록 한다.신 호 량 은 하나의 허가 집합 을 유지 합 니 다.저 희 는 Semaphore 를 초기 화 할 때 이 허가 집합 에 수량 값 을 입력 해 야 합 니 다.이 수량 값 은 같은 시간 에 공유 자원 에 접근 할 수 있 는 스 레 드 수량 을 대표 합 니 다.
【2】Semaphore 기본 용법
스 레 드 는 acquire()방법 을 통 해 허 가 를 받 은 다음 에 공유 자원 을 조작 할 수 있 습 니 다.허가 집합 이 할당 되 었 다 면 스 레 드 는 대기 상태 에 들 어 갈 것 입 니 다.다른 스 레 드 가 허 가 를 방출 할 때 까지 허 가 를 받 을 수 있 습 니 다.스 레 드 는 release()방법 으로 완성 할 수 있 고'허가'는 Semaphore 에 게 반 환 됩 니 다.
【3】Semaphore 상호 배척 자물쇠 실현
public class TestSemaphore {
// 1,
private final static Semaphore mutex = new Semaphore(1);
static class thread extends Thread{
@Override
public void run() {
try {
mutex.acquire();
System.out.println(getName()+" ");
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
//
mutex.release();
System.out.println(" !!!");
}
}
}
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Thread(new thread(),String.valueOf(i)).start();
}
}
}
하나의 수량 이 1 인 상호 배척 신 호 량 Semaphore 를 만 든 다음 에 10 개의 스 레 드 를 동시에 실행 합 니 다.스 레 드 에서 Semaphore 를 이용 하여 스 레 드 의 병행 을 제어 합 니 다.신 호 량 수치 가 1 밖 에 없 기 때문에 매번 한 스 레 드 만 실행 할 수 있 고 다른 스 레 드 는 대기 상태 에 들 어 갑 니 다.4.Callable,Future 와 Future Task
Future 인 터 페 이 스 는 일반적으로 Callable 이 실행 한 상 태 를 되 찾 는 데 사 용 됩 니 다.그 중의 주요 방법:
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.