자바 동기 화 도구 클래스 -- Semaphores

이 글 은 azibug 에서 작 성 했 습 니 다. 전재 출처 를 밝 혀 주 십시오. 상업 적 용도 로 글 링크 를 사용 하지 마 십시오.http://blog.csdn.net/owillll/article/details/8882562
작성 자: azibug   메 일 박스: azibug#163.com
신 호 량 (Semaphares)
개술
어떤 자원 탱크 에 동시에 접근 하 는 작업 수량 을 제어 하 는 데 사용 합 니 다.permits 가 0 일 때 까지 acquire 를 사용 하면 permits 가 0 이 아 닐 때 까지 계속 차단 합 니 다.permits 가 0 이 아니라면 acquire 를 사용 하면 permits 를 1 로 줄 입 니 다.자원 을 사용 하면 release 방출 허 가 를 사용 할 수 있 습 니 다. 그러면 permits 는 1 을 추가 합 니 다.
사용법:
  • new Semaphare (permits) 를 사용 하여 자 유 롭 게 작업 할 수 있 는 수량 을 초기 화 합 니 다
  • semaphare. acquire () 를 사용 하여 허 가 를 받 습 니 다. permits 값 이 0 이면 permits 가 0 이 아 닐 때 까지 계속 차단 합 니 다
  • 작업 이 끝나 면 semaphare. release (보통 finally 에서) 를 사용 하여 다른 스 레 드 에서 자원 을 사용 할 수 있 도록 허 가 를 방출 합 니 다.

  • 사용 장소:
    일반적으로 일부 자원 에 접근 할 수 있 는 스 레 드 수 를 제한 하 는 데 사용 된다.예 를 들 어 프린터 에서 permits 를 1 로 설정 하면 여러 스 레 드 가 인쇄 될 때 인쇄 대기 열 도 한 개 만 작 동 합 니 다.
    코드 예제
    PrintQueue. java 인쇄 대기 열, 인쇄 작업 수행
    package com.chaokuaidi.java.concurrency.utils.semaphores;
    
    import java.util.concurrent.Semaphore;
    import java.util.concurrent.TimeUnit;
    
    /**
     * This class implements the PrintQueue using a Semaphore to control the
     * access to it. 
     *
     */
    public class PrintQueue {
    	
    	/**
    	 * Semaphore to control the access to the queue
    	 */
    	private final Semaphore semaphore;
    	
    	/**
    	 * Constructor of the class. Initializes the semaphore
    	 */
    	public PrintQueue(){
    		semaphore=new Semaphore(1);
    	}
    	
    	/**
    	 * Method that simulates printing a document
    	 * @param document Document to print
    	 */
    	public void printJob (Object document){
    		try {
    			// Get the access to the semaphore. If other job is printing, this
    			// thread sleep until get the access to the semaphore
    			semaphore.acquire();
    			
    			Long duration=(long)(Math.random()*10);
    			System.out.printf("%s: PrintQueue: Printing a Job during %d seconds
    ",Thread.currentThread().getName(),duration); Thread.sleep(duration); TimeUnit.SECONDS.sleep(duration); } catch (InterruptedException e) { e.printStackTrace(); } finally { // Free the semaphore. If there are other threads waiting for this semaphore, // the JVM selects one of this threads and give it the access. semaphore.release(); } } }

    Job. 자바 작업 스 레 드, 인쇄 작업 호출
    package com.chaokuaidi.java.concurrency.utils.semaphores;
    
    /**
     * This class simulates a job that send a document to print.
     *
     */
    public class Job implements Runnable {
    
    	/**
    	 * Queue to print the documents
    	 */
    	private PrintQueue printQueue;
    	
    	/**
    	 * Constructor of the class. Initializes the queue
    	 * @param printQueue
    	 */
    	public Job(PrintQueue printQueue){
    		this.printQueue=printQueue;
    	}
    	
    	/**
    	 * Core method of the Job. Sends the document to the print queue and waits
    	 *  for its finalization
    	 */
    	@Override
    	public void run() {
    		System.out.printf("%s: Going to print a job
    ",Thread.currentThread().getName()); printQueue.printJob(new Object()); System.out.printf("%s: The document has been printed
    ",Thread.currentThread().getName()); } }

    Main. java 프린터 초기 화 및 인쇄 스 레 드 시작
    package com.chaokuaidi.java.concurrency.utils.semaphores;
    
    /**
     * Main class of the example.
     *
     */
    public class Main {
    
    	/**
    	 * Main method of the class. Run ten jobs in parallel that
    	 * send documents to the print queue at the same time.
    	 */
    	public static void main (String args[]){
    		
    		// Creates the print queue
    		PrintQueue printQueue=new PrintQueue();
    		
    		// Creates ten Threads
    		Thread thread[]=new Thread[10];
    		for (int i=0; i<10; i++){
    			thread[i]=new Thread(new Job(printQueue),"Thread "+i);
    		}
    		
    		// Starts the Threads
    		for (int i=0; i<10; i++){
    			thread[i].start();
    		}
    	}
    
    }
    

    주: 자바 동기 화 도구 류 의 모든 코드 는 github 에 맡 깁 니 다.https://github.com/azibug/concurrency  너 는 쉽게 그 를 구축 하고 테스트 할 수 있다.
    참고 자료:
    1., 대부분의 예 는 여기 서 기원 되 었 다.
    2. 《 자바 병발 프로 그래 밍 실전 》
    3. 《Thinking in Java》

    좋은 웹페이지 즐겨찾기