경진의 블로그

스레드 - 생성자 & 소비자 패턴 본문

개인참고자료/자바(네트워크)

스레드 - 생성자 & 소비자 패턴

aith 2008. 7. 12. 19:51
생성자 - 소비자 패턴

멀티스레드의 대표적인 예제로 꼽히는 생성자 - 소비자 패턴에 대해 알아보자

첨부파일


Queue.java
Queue 인터페이스는 생성자와 소비자가 공통적으로 사용하게 될 메소드를 정의해 놓은 인터페이스다.
생성자는 put() 메소들 이용해서 데이터 큐에 넣을 것이고 소비자는 pop() 메소드를 이용해 큐에 저장된 데이터를 꺼내서 사용한다.

JobQueue.java
JobQueue 클래스는 Queue 인터페이스를 구현하는 클래스다.
생성자와 소비자는 실제 Queue 인터페이스만 바라보지만 그 구체적인 구현은 JobQueue에서 담당한다.

put()과 pop() 메소드 안에서 wait()와 notify()가 사용되었는데 이 메소드를 사용하려면 항상 synchronized 키워드를 사용해서 락(제어권)을 얻어야한다.

※ 실제로 동기화를 하지 않고 실행하면 IllegalMonitorStateException 과 InterruptedException 이 발생한다.

그리고 프로세스의 흐름상 새로운 데이터가 큐에 들어올 때는 (만약, 대기중인 소비자 스레드가 있을 경우) 일거리가 생겼으므로 그 스레드를 깨워줘야 할 것이다. 따라서 put() 메소드에서는 notify() 메소드를 호출해주고 반대로 큐에서 데이터를 꺼내려고 할 때는 현재 큐가 비어 있는지를 확인해서 큐에 아무런 데이터가 없다면 소비자 스레드는 wait() 메소드를 호출하고 대기상태로 들어가야 한다.

Producer.java
생성자에 해당하는 클래스다. Runnable 인터페이스를 구현한 클래스며, 하는 일 또한 단지 큐에 0부터 하나씩 숫자를 증가시키면서 집어넣는 일 뿐이다.

Consumer.java
소비자에 해당하는 클래스다. Runnable 인터페이스를 구현한 클래스며, 단순 루프를 돌면서 큐에서 데이터를 하나씩 꺼내서 자신의 이름과 함께 콘솔 출력하는 역할을 한다.

Tester.java
큐, 생성자, 소비자를 이용해서 테스트하는 클래스다. 먼저 큐를 생성하고 그 후 소비자 세 개를 생성해서 시작시킨다. 그리고 생성자를 하나 만들어서 시작 시킨 후 0.5초 생성자를 종료 시키고 다시 0.5초 후에 소비자들을 모두 종료 시킨다.

대규모 트래픽이 발생하는 곳에서 싱글톤 패턴을 사용할 때 종종나타나는 'Double-Checked Locking' 문제다 (http://www-106.ibm.com/developerworks/java/library/j-dcl.html?loc=dwmain 을 참고한다.)
0 Comments
댓글쓰기 폼