자바 동기 화 도구 클래스 -- Semaphores
3998 단어 자바 동기 화 도구
작성 자: azibug 메 일 박스: azibug#163.com
신 호 량 (Semaphares)
개술
어떤 자원 탱크 에 동시에 접근 하 는 작업 수량 을 제어 하 는 데 사용 합 니 다.permits 가 0 일 때 까지 acquire 를 사용 하면 permits 가 0 이 아 닐 때 까지 계속 차단 합 니 다.permits 가 0 이 아니라면 acquire 를 사용 하면 permits 를 1 로 줄 입 니 다.자원 을 사용 하면 release 방출 허 가 를 사용 할 수 있 습 니 다. 그러면 permits 는 1 을 추가 합 니 다.
사용법:
사용 장소:
일반적으로 일부 자원 에 접근 할 수 있 는 스 레 드 수 를 제한 하 는 데 사용 된다.예 를 들 어 프린터 에서 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》