2009년 6월 8일 월요일

서블릿을 이용한 간단한 Thread 프로그램 구현해 보기

일반적인 웹 애플리케이션을 개발할 때 서블릿을 이용할 경우 자바 Thread를 이용할 경우가 별로 없는 듯 하다. 왜냐하면 서블릿을 기존의 HTML을 렌더링하는 일반적인 용도로 사용할 경우에는 Thread를 이용할 경우가 확실히 작아진다.

하지만, 타 기종간의 애플리케이션을 기반으로 한 서버 사이드의 영역으로서 J2EE 프로젝트에서 서블릿을 사용할 경우 실행 파일과 같은 역할을 수행하는 경우가 많다. 실제로 서블릿은 CGI 형태의 코딩에 어울리는 코딩 기법이기도 하다. 서버 사이드의 실행 파일이라고 할 수 있겠다.

사실 서블릿은 그 용도가 아주 다양한데, 웹 애플리케이션을 공부하는데 있어 J2EE를 시작한다면 JSP를 공부하기 보다는 먼저 서블릿을 공부하는게 올바른 순서라고 할 수 있다.
서두가 길어졌다. 제목대로 간단하게 서블릿 코드 상에 Thread를 구동시켜 보자.

먼저, 간단한 Thread 코드를 살펴보자. [CountRunable.java]
/**
 * CountRunable.java
 *
 * Runnable 인터페이스를 구현한 간단한 Count Thread 프로그램
 */
package net.wiseant.test.thread;

/**
 * @author SangHyup LEE
 * @version 1.0
 *
 */
public class CountRunable implements Runnable {

    private int count = 0;
    
    public CountRunable(int count) {
        this.count = count;
    }
    
    /* (non-Javadoc)
     * @see java.lang.Runnable#run()
     */
    public void run() {
        // TODO Auto-generated method stub
        System.out.println("COUNT : " + count);
    }

}


[CountRunable.java]는 Runable를 implements 하여 구현한 간단한 Thread 코드이다. 그럼 CountRunable 클래스를 호출하는 서블릿 코드를 살펴보자.

[CountThreadServlet]
/**
 * CountThreadServlet.java
 *
 * CountRunable 쓰레드를 수행하기 위한 servlet 프로그램
 */
package net.wiseant.test.web.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.wiseant.test.thread.CountRunable;

public class CountThreadServlet extends HttpServlet {

    private static int count = 0;
    
    /**
     * The doGet method of the servlet. <br>
     *
     * This method is called when a form has its tag value method equals to get.
     *
     * @param request the request send by the client to the server
     * @param response the response send by the server to the client
     * @throws ServletException if an error occurred
     * @throws IOException if an error occurred
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        while ( count <= 20 ) {
            CountRunable countRunable = new CountRunable(count);
            Thread countThread = new Thread(countRunable);
            countThread.start();
            count++;
        }
        
    }

}


doGet 메소드에 간단하게 Runable를 implements하여 구현한 CountRunable를 실행하고 있는 코드가 보인다. 일반적으로 자바 Thread를 수행하는 코드와 다를 것이 없다.
코드를 실제로 수행해보면 count를 static 변수로 선언하였기 때문에 각 Thread가 수행되는 순서에 따라서 증가하대 그 순서가 serial  하지 않고, Thread가 수행되는 순서에 따라서 실행되는 것을 알 수 있다. 다음은 예제로 돌려본 실행하면이다.

COUNT : 0
COUNT : 1
COUNT : 2
COUNT : 6
COUNT : 4
COUNT : 3
COUNT : 8
COUNT : 13
COUNT : 11
COUNT : 10
COUNT : 5
COUNT : 9
COUNT : 7
COUNT : 14
COUNT : 12
COUNT : 15
COUNT : 16
COUNT : 18
COUNT : 19
COUNT : 20
COUNT : 17

댓글 없음: