Java 동시 프로그래밍 경계 캐시 구현
1. 경계 캐시의 기본 클래스
패키지 cn.xf.cp.ch14;/** * 함수 : 바운드 캐시 구현 기본 클래스 * 시간 : 2:20:00 pm * 파일 : baseboundedbuffer.java * @author <v> */public class baseboundedbuffer <v> {private final v [] buf; 개인 int 꼬리; 개인 int 헤드; 개인 int 수; public baseboundedbuffer (int factions) {// 배열 초기화 this.buf = (v []) 새 개체 [용량]; } // 데이터를 입력하면 최종 방법을 다시 작성할 수 없습니다. 보호 된 동기화 된 최종 void doput (v v) {buf [tail] = v; if (++ tail == buf.length) {tail = 0; } // 방법 삽입, 총 금액 ++ ++ 카운트; } / *** 데이터를 꺼냅니다* @return* / 보호 된 동기화 된 최종 v dotake () {v v = buf [head]; buf [head] = null; if (++ head == buf.length) {head = 0; } --세다; 반환 v; } // 카운트를 판단하여 배열이 전체 공개 동기화 된 최종 부울 ISFULL () {return count == buf.length; } public synchronized final boolean isempty () {return count == 0; }}2. 작업을 수행하기 전에 전제 조건을 결정하십시오
패키지 cn.xf.cp.ch14;/*** 함수 : 삽입을 확인하고 요소 작업을 먼저 얻은 다음 작업을 수행하십시오. 검증은 통과되지 않으며 운영되지 않습니다 * 시간 : 2:33:41 PM * 파일 : GrumpyBoundedBuffer.java * @저자 관리자 * * @param <v> */public class grumpyboundedbuffer <v> {public grumpyboundedbuffer (int size) {size); } public synchronized void put (v v)은 예외를 던집니다 {// 전체 대기열 인 경우 새 요소를 삽입 할 수 없습니다 (this.isfull ()) {새 예외 ( "Qule 초과"); } this.doput (v); } // 마찬가지로, 큐가 비어 있으면, 새 요소를 검색 할 수 없습니다. 공개 동기화 된 v take ()은 예외를 던지려면 {if (this.isempty ()) {새 예외 ( "대기열의 요소 없음"); } reture this.dotake (); }}3. 폴링과 수면을 통해 간단한 차단을 달성하십시오
패키지 cn.xf.cp.ch14;/** *함수 : 폴링 및 최대 절전 모드를 통한 간단한 차단 구현 *시간 : 2:55:54 PM *파일 : sleepyBoundedBuffer.java * @저자 관리자 * *@param <v> */public class sleepyboundedbuffer <V> extends BaseBoundedBuffer <v> {// 2S Private thermation <v> {// 2000; public sleepyboundedbuffer (int capacity) {슈퍼 (용량); } // 대기열에 넣을 때 공개 void put (v v)을 던지면 중단 된 exception {while (true) {// 루프가 여기에 잠겨 있지 않으면 잠금이 해제되지 않습니다. 최대 절전 모드가 잠겨 있지 않으면 수면이 잠겨 있고 동면 중에는 다른 사람들이 작동 할 수 없습니다. 요소가 동기화되는 것은 불가능합니다 (this) {// 큐가 가득 차 있지 않으면 요소를 (! this.isfull ()) {this.doput (v); 반품; }} // 그렇지 않으면 CPU를 잠들고 종료하기 위해 thread.sleep (sleep_granularity); }} public v take ()가 throws InterruptedException {while (true) {// 루프가 여기에 잠겨 있지 않으면 잠금이 해제되지 않습니다. 수면이 잠겨 있지 않으면 수면이 잠겨 있고 잠을 자면 다른 사람들이 작동 할 수 없습니다. 동기화 된 (this)로 새 요소가 오지 않을 것입니다 (this) {// 배열 부분이 비어 있으면 데이터를 검색 할 수 있습니다. } // 대기열이 비어 있으면 몇 초 동안 다시 잠을 자십시오. }}}4. 조건부 대기열
패키지 cn.xf.cp.ch14;/** * 함수 : 조건 대기열 사용 * 시간 : 3:32:04 pm * 파일 : boundedBuffer.java * @author Administrator * * @param <v> */public class boundedbuffer <v> 확장 기본 바운드 버퍼 <v> {int paction) {슈퍼 용량) v. } /** * 데이터 요소를 넣습니다 * @param v * @Throws InterruptedException * /public synchronized void put (v v) 던지기 중간 exception {while (this.isfull ()) {// 여기에 프로그램이 중단되고 잠금이 this.wait (); } // 대기열이 가득 찼다면 프로그램이 깨어나고 잠금 장치가 회복됩니다 .Doput (v); // 실행이 끝나고 다른 대기열이 깨어납니다. } public synchronized v take ()가 throws InterruptedException {while (this.isempty ()) {this.wait (); } v v = this.dotake (); this.notifyall (); 반환 v; }}읽어 주셔서 감사합니다. 도움이되기를 바랍니다. 이 사이트를 지원 해주셔서 감사합니다!