AQS 동기 화 장치 상세 설명

4660 단어 [Java 언어]
1. AQS 동기 화 된 두 가지 데이터 구 조 는 다음 과 같다.
그림.
 
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:
 

좋은 웹페이지 즐겨찾기