본문 바로가기

기타/it

JAVA) 생산자-소비자 문제 자바 소스코드 구현 및 설명(알고리즘,빅데이터)

반응형

데이터를 넣는부분이 생산자

데이터를 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++;

}

}

}

결과

반응형