AQS 동기 화 장치 상세 설명
4660 단어 [Java 언어]
그림.
2. Semapheore 는 무엇 입 니까?
emaphore 는 신 호 량 이라는 뜻 으로 특정 자원 에 접근 하 는 스 레 드 수 를 제어 하 는 역할 을 합 니 다.
2.1 구조 방법:
2.3 기본 사용:
2.3.1 수요 장면
자원 접근, 서비스 흐름 제한
public class SemaphoreSample {public static void main(String[] args) { Semaphore semaphore = new Semaphore(2);for (int i=0;i<5;i++){new Thread(new Task(semaphore,"yangguo+"+i)).start(); } }static class Task extends Thread{ Semaphore semaphore;
public Task(Semaphore semaphore,String tname){this.semaphore = semaphore;this.setName(tname); }public void run() {try {semaphore.acquire();System.out.println(Thread.currentThread().getName()+":aquire() attime:"+System.currentTimeMillis()); Thread.sleep(1000);semaphore.release();System.out.println(Thread.currentThread().getName()+":aquire() attime:"+System.currentTimeMillis()); } catch (InterruptedException e) { e.printStackTrace(); } } }} :Thread-3:aquire() at time:1563096128901Thread-1:aquire() at time:1563096128901Thread-1:aquire() at time:1563096129903Thread-7:aquire() at time:1563096129903Thread-5:aquire() at time:1563096129903Thread-3:aquire() at time:1563096129903Thread-7:aquire() at time:1563096130903Thread-5:aquire() at time:1563096130903Thread-9:aquire() at time:1563096130903Thread-9:aquire() at time:1563096131903 , acquire(), release() acquire()。
결 과 는 분석 할 수 있다.
한 번 에 두 개의 스 레 드 만 acquier () 를 실행 하고 스 레 드 relsase 액 만 있 습 니 다.
인쇄 결 과 를 통 해 알 수 있 듯 이 한 번 에 두 개의 스 레 드 만 acquire () 를 실행 하고 스 레 드 만 release () 방법 을 한 후에
acquire () 를 실행 하 는 다른 스 레 드 가 있 습 니 다.
2.
Countdown Latch 사용 및 응용 장면
예시
Countdown Latch 가 뭐 예요?
Countdown Latch 라 는 종 류 는 다른 스 레 드 가 각자 의 작업 을 마치 기 를 기다 린 후에 실행 할 수 있 습 니 다.예.
예 를 들 어 응용 프로그램의 메 인 스 레 드 는 프레임 워 크 서 비 스 를 시작 하 는 스 레 드 가 모든 프레임 워 크 서 비 스 를 시작 한 후에 다시 실행 하 기 를 원 합 니 다.
그래.
CountDownlatch 는 어떻게 일 합 니까?
Countdown Latch 는 하나의 계수 기 를 통 해 이 루어 집 니 다. 계수기 의 초기 값 은 스 레 드 의 수량 입 니 다.매번
한 라인 이 자신의 임 무 를 완성 하면 계수기 의 값 이 1 로 줄어든다.카운터 값 이 0 에 도 달 했 을 때 모든 것 을 표시 합 니 다.
스 레 드 는 이미 임 무 를 완성 한 후에 폐쇄 적 으로 기다 리 는 스 레 드 는 실행 임 무 를 회복 할 수 있 습 니 다.
일반적인 API:
demo:
CountDownLatch
.countDown()
CountDownLatch
필드:
/** * */public class SeeDoctorTask implements Runnable {private CountDownLatch countDownLatch;public SeeDoctorTask(CountDownLatch countDownLatch){this.countDownLatch = countDownLatch; }public void run() {
try { System.out.println(" "); Thread.sleep(3000); System.out.println(" , "); } catch (InterruptedException e) { e.printStackTrace(); }finally {if (countDownLatch != null)countDownLatch.countDown()
/** * */public class QueueTask implements Runnable {private CountDownLatch countDownLatch;public QueueTask(CountDownLatch countDownLatch){this.countDownLatch = countDownLatch; }public void run() {try { System.out.println(" ...."); Thread.sleep(5000); System.out.println(" , "); } catch (InterruptedException e) { e.printStackTrace(); }finally {if (countDownLatch != null)countDownLatch.countDown(); } }
public class CountDownLaunchSample {public static void main(String[] args) throwsInterruptedException {long now = System.currentTimeMillis(); CountDownLatch countDownLatch = new CountDownLatch(2);new Thread(new SeeDoctorTask(countDownLatch)).start();new Thread(new QueueTask(countDownLatch)).start();// 2 , countDownLatch.await(); System.out.println("over, cost:"+(System.currentTimeMillis()now)); }}
CyclicBarrier
Executors
주로 스 레 드 탱크 를 만 드 는 데 사 용 됩 니 다. 스 레 드 탱크 의 생 성 을 대리 하여 입 구 를 만 드 는 매개 변 수 를 간단 하 게 만 듭 니 다.
중요 한 방법
newCachedThreadPool 은 캐 시 가능 한 스 레 드 풀 을 만 듭 니 다. 스 레 드 풀 길이 가 처리 수 요 를 초과 하면
남 은 스 레 드 를 유연 하 게 회수 할 수 있 습 니 다. 회수 할 수 없 으 면 새 스 레 드 를 만 듭 니 다.
new Fixed ThreadPool 은 고정 라인 풀 을 만 들 고 스 레 드 의 최대 병발 수 를 제어 할 수 있 습 니 다. 초과 한 것 입 니 다.
스 레 드 는 대기 열 에서 기다 릴 것 입 니 다.
new Scheduled ThreadPool 은 정기 적 이 고 주기 적 인 작업 수행 을 지원 하 는 고정 라인 풀 을 만 듭 니 다.
그래.
new Single ThreadExecutor 는 단일 라인 스 레 드 풀 을 만 듭 니 다. 유일한 작업 만 사용 합 니 다.
모든 작업 이 지 정 된 순서 (FIFO, LIFO, 우선 순위) 에 따라 수행 되도록 스 레 드 로 작업 을 수행 합 니 다.
demo: