데이터를 넣는부분이 생산자
데이터를 putOff하는부분이 소비자로 가정
Buffer.java
import java.util.Arrays;
public class Buffer {
// 버퍼의 최대 크기
private final int BUFFER_MAX_SIZE = 5;
// 버퍼의 현재 크기 (블로킹인수)
private int bufferSize = 0;
// 데이터가 가득 찼는지 체크하는 변수
private boolean isFull = false;
// 현재 가리키고 있는 데이터 위치
private int bufferPointer = 0;
// 버퍼당 크기 제한값
private final int BUFFER_ELEMENT_MAX_SIZE = 20;
// 다음 버퍼
private Buffer nextBuffer;
// 저장되는 데이터 값의 배열
private byte[][] buffer = new byte[BUFFER_MAX_SIZE][];
// 데이터를 버퍼에 저장하는 메서드
// 반환값이 false이면 저장 실패, true이면 저장 성공이다.
public boolean put(byte[] data) {
if (data == null) {
return false;
}
if (bufferSize == BUFFER_MAX_SIZE) {
return false;
}
if (data.length > BUFFER_ELEMENT_MAX_SIZE) {
return false;
}
buffer[bufferPointer % BUFFER_MAX_SIZE] = data;
bufferPointer++;
bufferSize++;
System.out.println("put : " + Arrays.toString(data));
// 넣었을 때, 크기가 5라면, isFull 을 true로 만든다.
if (bufferSize == 5) {
isFull = true;
}
return true;
}
// 버퍼의 크기를 가져오는 메서드
public int getSize() {
return bufferSize;
}
// 데이터를 꺼내는 메서드
public byte[] putOff() {
if (bufferSize == 0) {
return null;
}
byte[] data = buffer[bufferPointer % BUFFER_MAX_SIZE];
buffer[bufferPointer % BUFFER_MAX_SIZE] = null;
bufferPointer++;
bufferSize--;
// 뺐을때 크기가 0이라면, isFull 을 false로 만든다.
if (bufferSize == 0) {
isFull = false;
}
return data;
}
// 버퍼가 가득 차있는지 체크하는 메서드
public boolean isFull() {
return isFull;
}
// 다음 버퍼를 저장하는 메서드
public void setNext(Buffer buffer) {
if (nextBuffer != null) {
return;
}
nextBuffer = buffer;
}
// 다음 버퍼를 가져오는 메서드
public Buffer getNext() {
return nextBuffer;
}
}
Main.java
import java.util.Arrays;
public class Main {
Buffer buf1;
Buffer buf2;
public static void main(String[] args) {
new Main();
}
public Main() {
System.out.println("Hello World!");
// 버퍼 정보를 초기화한다.
buf1 = new Buffer();
buf2 = new Buffer();
buf1.setNext(buf2);
buf2.setNext(buf1);
processForBuffer();
}
private void processForBuffer() {
// 데이터를 세팅함.
byte[][] datas = new byte[20][];
datas[0] = new byte[]{1};
datas[1] = new byte[]{2};
datas[2] = new byte[]{3};
datas[3] = new byte[]{4};
datas[4] = new byte[]{5};
datas[5] = new byte[]{6};
datas[6] = new byte[]{7};
datas[7] = new byte[]{8};
datas[8] = new byte[]{9};
datas[9] = new byte[]{10};
datas[10] = new byte[]{11};
datas[11] = new byte[]{12};
datas[12] = new byte[]{13};
datas[13] = new byte[]{14};
datas[14] = new byte[]{15};
datas[15] = new byte[]{16};
datas[16] = new byte[]{17};
datas[17] = new byte[]{18};
datas[18] = new byte[]{19};
datas[19] = new byte[]{20};
Buffer currentSavingBuffer = buf1;
int i = 0;
while (true) {
// 현재 데이터를 가져옴. 만약, i의 값이 datas보다 크면 null값을 초기화함
byte[] currentData = i < datas.length ? datas[i] : null;
// 현재 저장하고있는 버퍼가 가득 차있는지 체크
if(currentSavingBuffer.isFull()){
// 현재 값을 처리하고 있는 버퍼가 비어있는지 체크
if(!currentSavingBuffer.getNext().isFull()){
// 값을 처리하는 버퍼와 저장하는 버퍼를 교체하고, 값을 저장 및 처리함.
currentSavingBuffer = currentSavingBuffer.getNext();
currentSavingBuffer.put(currentData);
System.out.println("put off value : " + Arrays.toString(currentSavingBuffer.getNext().putOff()));
System.out.println("---------------------next buffer!------------------");
}
}else{
// 현재 데이터값이 존재하면, 값을 저장함
if(currentData!=null){
currentSavingBuffer.put(currentData);
}
// 데이터 처리 버퍼가 가득 full 상태라면, 데이터 처리 버퍼에서 값을 처리함.
if(currentSavingBuffer.getNext().isFull()){
System.out.println("put off value : " + Arrays.toString(currentSavingBuffer.getNext().putOff()));
}
}
// 만약, 저장버퍼, 현재버퍼의 크기가 모두 0이라면, 데이터처리가 모두 끝난 것으로 간주하고 중지
if(currentSavingBuffer.getSize() == 0 && currentSavingBuffer.getNext().getSize() == 0){
break;
}
// 현재 크기조회
System.out.printf("size a : %d / b : %d\n", currentSavingBuffer.getSize(), currentSavingBuffer.getNext().getSize());
i++;
}
}
}
'기타 > it' 카테고리의 다른 글
가상현실 VR 어디까지 와있나? (1) | 2020.10.06 |
---|---|
코스페이시스(COSPACES)로 가상현실 , 컨텐츠,애니메이션,게임 구현 (0) | 2020.10.06 |
자바 프로그래밍 예제 상수값 입출력,자기소개 입출력, 소스코드, 설명,JAVA (0) | 2020.10.06 |
정보처리기사 실기 예상 문제 풀어봅시다 (1) (2020개편) (0) | 2020.09.17 |
아이폰 재난문자 끄기, 설정(진동)으로 스트레스 NO ! NO! (0) | 2020.09.13 |