Sponsored By
















Thread 기능을 이용한 Stack 을 만들어 보는 방법임.

 

 

 

 

 

 

ㅁ. 먼저, 한번 보고가자.

쓰레드를 이용해서 스택을 만들고, 이를 세개의 쓰레드로 각각

 

- Producer : push()만 수행하는 쓰레드

- Consumer : pop()만 수행하는 쓰레드

- Monitor : dump()만 수행하는 쓰레드를 동작시킨다.

- Push와 Pop는 랜덤한 시간 간격으로 동작하고

- dump는 1초의 일정한 시간 간격으로 동작한다.

 

이 때, 세개의 쓰레드가 동일한 스택을 공유해야하기 때문에 스택을 파라미터로 준다.

 

동일한 자원(Resource)를 서로 access하면서 생기는 Racing condition 문제를 해결하기 위해 

synchronized라는 키워드를 사용하면 된다. 

 

 

 

 

 

00. 'Stack'으로 클래스를 하나 만들어서 생성자와 관련동작들을 넣어보자.







01. 메인클래스에 객체를 생성하고 Thread로 던지고 시작시켜보자.








02. 결과값을 확인할 수 있다.

 

 

 

 

 

※. 코드

 

 

class Stack {

private int[] stack;

private int top;

 

// Constructor

public Stack(int size)

{

if(size < 1)

{

size = 10;

}

 

this.stack = new int[size];

this.top = -1;

}

 

synchronized public void push()

{

if( isFull() )

{

System.out.println("[Error] Stack is Full");

return;

}

 

this.stack[++top] = (int)(Math.random() * 1000);

}

 

public boolean isFull()

{

if( this.top == this.stack.length -1)

{

return true;

}

 

return false;

}

 

synchronized public void pop()

{

if( isEmpty() )

{

System.out.println("[Error] Stack is Empty");

return;

}

 

top --;

}

 

public boolean isEmpty()

{

if(this.top == -1)

{

return true;

}

 

return false;

}

 

 

synchronized public void dump()

{

System.out.println("========= Stack Dump ========");

 

for(int i=top; i>=0; i--)

{

System.out.println(this.stack[i]);

}

}

}

 

class Producer implements Runnable {

private Stack stack; 

 

// Constructor

public Producer(Stack stack)

{

this.stack = stack;

}

 

@Override

public void run() {

// TODO Auto-generated method stub

// 무한루프 돌면서 push()만 수행할 예정

// 간격은 랜덤

while(true)

{

try {

Thread.sleep( (int)(Math.random() * 1000)   );

} catch (Exception e) {

// TODO: handle exception

}

 

stack.push();

}

}

 

}

 

class Consumer implements Runnable {

private Stack stack; 

 

// Constructor

public Consumer(Stack stack)

{

this.stack = stack;

}

 

 

@Override

public void run() {

// TODO Auto-generated method stub

while(true)

{

try {

Thread.sleep( (int)(Math.random() * 1000)   );

} catch (Exception e) {

// TODO: handle exception

}

 

stack.pop();

}

}

 

}

 

class Monitor implements Runnable {

private Stack stack; 

 

// Constructor

public Monitor(Stack stack)

{

this.stack = stack;

}

 

@Override

public void run() {

// TODO Auto-generated method stub

while(true)

{

try {

Thread.sleep( 1000 );

} catch (Exception e) {

// TODO: handle exception

}

 

stack.dump();

}

}

 

}

 

public class Test {

 

public static void main(String[] args) {

// TODO Auto-generated method stub

 

Stack stack = new Stack(7);

 

Producer p = new Producer(stack);

Consumer c = new Consumer(stack);

Monitor m = new Monitor(stack);

 

Thread tp = new Thread(p);

Thread tc = new Thread(c);

Thread tm = new Thread(m);

 

tp.start();

tc.start();

tm.start();

 

 

}

 

 

}

 

 

 



Sponsored By















+ Recent posts