본문 바로가기

Development/Programming

[Java Design Patten] Future 패턴

케이크를 사러 빵집에 갔습니다. 주문을 하자 주인이 저녁에 찾으러 와주세요 하면서 교환권을 줍니다. 저녁이 되어서 교환권을 들고 케이크를 가지러 갔습니다. 주인은 케이크를 건네 주었습니다. 


Futrue 패턴은 위의 줄거리와 유사하다. 


우선은 Main을 보자 host를 통해 Data를 받는다. 그리고 다른 작업(여기서는 쉬는 2초간 대기)을 하다가 데이터를 사용한다. Data를 교환권이라고 보면 되다.


public static void main (String[] agrs) {

System.out.println("main BEGIN");

final Host host = new Host();

final Data data1 = host.request(10, 'A');

final Data data2 = host.request(20, 'B');

final Data data3 = host.request(30, 'C');

System.out.println("main otherJob BEGIN");

try {

Thread.sleep(2000);

} catch (final InterruptedException e) {

}

System.out.println("main otherJob END");

System.out.println("data 1 = " + data1.getContent());

System.out.println("data 2 = " + data2.getContent());

System.out.println("data 3 = " + data3.getContent());

System.out.println("main END");

}


Host에서는 FureData를 생성을 하며 RealData를 Thread로 작성하여 넣어준다.


 public class Host {

public Data request (final int count, final char c) {

System.out.println("   request(" + count + ", " + c + ") BEGIN");

final FutureData future = new FutureData();


new Thread () {

public void run () {

final RealData realData = new RealData(count, c);

future.setRealData(realData);

}//end run Method

}.start();

System.out.println(" request (" + count + ", " + c + ") END");

return future;

}

}


FureData는 realData를 가지고 있으며 readData가 set이 되면 값을 읽을수 있다.


public class FutureData implements Data {


  private RealData realData = null;

        private boolean ready = false;

public synchronized void setRealData (final RealData realData) {

if (ready) {

return;

}//end if


this.realData = realData;

this.ready = true;

notifyAll();

}

public synchronized String getContent () {

while (!this.ready) {

try {

wait();

} catch (final InterruptedException e) {

}

}

return this.realData.getContent();

}

}

RealData는 진짜 데이터를 처리하는 작업을 처리한다.


public class RealData implements Data {

private final String content;

public RealData (final int count, final char c) {

System.out.println(" making RealData(" + count + ", " + c + ") BEGIN");

char [] buffer = new char[count];

for (int i=0;i<count;i++) {

buffer[i] = c;

try {

Thread.sleep(100);

} catch (final InterruptedException e) {

}

}

System.out.println(" making RealData(" + count + ", " + c + ") END");

this.content = new String(buffer);

}

public String getContent () {

return this.content;

}

}



public interface Data {

public abstract String getContent();

}