다 중 스 레 드-Semaphore 상세 설명
다음 코드 를 보십시오.
public class Service{
//Semaphore.Semaphore(int permits)
public Semaphore semaphore = new Semaphore(1);
public void testService() throws InterruptedException{
semaphore.acquire();
System.out.println(Thread.currentThread().getName() +" "+ "begin");
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() +" " + "end");
semaphore.release();
}
}
Semaphore(int permits);구조 기
permits 인자:같은 시간 에 최대 semaphore.acquire(),semaphore.release()간 코드 의 스 레 드 개 수 를 동시에 실행 할 수 있 습 니 다.구조 방법 중의 perimit 는 최종 적 으로 허가 수량 을 동시에 실행 할 수 있 는 것 이 아니 라 초기 수량 일 뿐 입 니 다.acquire()방법 은 한 번 실 행 될 때마다 동시에 실행 할 수 있 는 스 레 드 수-1,release()방법 은 한 번 실 행 될 때마다 실행 가능 한 스 레 드 수+1 입 니 다.코드 블록 을 실행 할 자격 이 없 을 때 기 다 립 니 다.사실 acquire()는 본질 적 으로 감법 작업 입 니 다.release()는 덧셈 작업 입 니 다.우 리 는 당연히-1 개+2 개,즉 1 회 acquire(),2 회 release()를 호출 할 수 있 습 니 다.이때 코드 블록 이 동시에 실행 할 수 있 는 스 레 드 수량 은 초기 화 할 때 보다 하나 더 많 습 니 다.물론 acquire 와 release 방법 도 int 인 자 를 추가 하여 여러 개의 허 가 를 사용 하거나 방출 할 수 있 습 니 다.
public class TestSemaphore {
public static void main(String[] args) {
Service service = new Service();
Thread t = new ThreadTest(service);
t.setName("A");
Thread t2 = new ThreadTest(service);
t2.setName("B");
Thread t3 = new ThreadTest(service);
t3.setName("C");
t.start();
t2.start();
t3.start();
}
}
class ThreadTest extends Thread{
Service service;
public ThreadTest(Service service){
this.service = service;
}
@Override
public void run() {
try {
service.testService();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
호출 결 과 는 다음 과 같 습 니 다.
A begin A end B begin B end C begin C end
위 에 설 치 된 최대 acquire()와 release()사이 의 코드 블록 을 실행 할 수 있 는 스 레 드 수 는 1,즉 직렬 실행 으로 스 레 드 동기 화 를 실현 합 니 다.
Semaphore(int permits)에서 permits 가 2 로 설정 되 었 을 때 다음 과 같 습 니 다.
B begin A begin A end B end C begin C end
BC 스 레 드 가 코드 블록 에 동시에 들 어간 것 을 발견 할 수 있 습 니 다.
다른 방법:
int availablePermits()현재 사용 가능 한 허가 수 int drainPermits()를 되 돌려 현재 허가 수 를 되 돌려 준 후 0 int getQueueLength()로 설정 하여 허 가 를 기다 리 는 스 레 드 갯 수 boolean hasQueuedThreads()현재 기다 리 는 스 레 드 가 있 는 지 여부
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JAVA 다 중 스 레 드 메커니즘 의 스 레 드 생 성target 을 실행 대상 으로 지정 한 name 을 이름 으로 하고 group 에서 참조 하 는 스 레 드 그룹의 일원 으로 새 Thread 대상 을 할당 합 니 다. 이 스 레 드 가 독립 된 Runnable 실...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.