다 중 스 레 드-Semaphore 상세 설명

java.util.concurrent.semaphore 가 제공 하 는 기능 은 synchronized 가 제공 하 는 기능 과 일치 하지만 Semaphore 는 synchronized 의 업그레이드 버 전이 라 고 할 수 있 습 니 다.Semaphore 는 라인 의 병발 수량 을 제어 할 수 있 지만 단순 synchronized 는 할 수 없습니다.
다음 코드 를 보십시오.
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()현재 기다 리 는 스 레 드 가 있 는 지 여부

좋은 웹페이지 즐겨찾기