자바(Java)/JAVA 2SE

Thread(쓰레드) 사용 설명

본클라쓰 2009. 2. 23. 18:56

 

 쓰레드란 프로그램 내에서 실행되는 일종의 프로세서(Processer)로 하나의 프로그램 내에서 동시에 또 다른 작업을 실행시켜야 할 필요가 있을 때 사용하는 방법이다. 윈도우는 하나의 프로그램에 하나의 프로세스가 실행되어 컴퓨터의 자원을 사용한다. 하지만 자바에서는 하나의 프로세스 내부에서 또 다른 프로세스인 쓰레드란 개념을 사용한다. 즉, 하나의 프로그램의 유일한 프로세스에서 다수의 쓰레드를 사용하여 단위 업무를 처리하는 일련의 제어 흐름을 말한다. 쓰레드는 생성만 시켜주면 프로그래밍 된 대로 알아서 움직이고 자신이 작업을 전부 마친 후에는 알아서 종료한다.

 

 즉, 쓰레드라는 개념을 사용하면 컴퓨터의 자원을 적게 사용하면서 여러 가지 일을 동시에 수행시킬 수 있다. 자바에서 쓰레드를 구현하기 위해서는 Thread 클래스를 상속받아 구현하는 방법과 Runnable 인터페이스를 구현하는 방법 두 가지가 있다. 쓰레드를 구현하면 생성과 동시에 가상 CPU에 코드와 데이터를 보내게 되고 start() 메소드로 쓰레드를 실행 시키면 쓰레드에 있던 코드가 실행되는 방식다. 즉, 쓰레드는 가상 CPU에 쓰레드가 실행할 코드를 가지고 있다가 활성화가 되면 코드를 실행시키는 방법을 통해 프로세서의 흐름을 제어한다.

 

 

Thread 클래스 상속받아 구현하는 방법

class ThreadTest extends Thread {

 

    super("이름");

 

    public void run() {

        실행시킬 코드 작성 

    } 

}

 

  

Runnable 인터페이스 구현 방법

class ThreadTest implements Runnable {

 

    Thread thread = new Thread();

 

    public void run() {

        실행시킬 코드 작성 

    } 

}

 

 쓰레드는 상속을 통해 구현하던지 Runnable 인터페이스를 구현하던지 실행시킬 코드는 public void run() 메소드 안에 들어가야 된다. run() 메소드 안에 있는 코드가 실질적으로 쓰레드를 구성하는 코드이다.

 

 쓰레드는 생성과 동시에 활성화되어 가상 CPU에 탑재된다. 그렇다고 쓰레드안에 있는 코드가 바로 실행되는 것은 아니고 start() 메소드를 호출해야만 실행된다. Runnable 인터페이스를 구현한 예제에 보면 Thread thread = new Thread() 생성 코드가 있다. run() 메소드 안에는 실행시킬 코드가 작성되어 있다. 이 때 쓰레드를 실행시키는 방법은 thread.start() 를 사용하여 실행시킨다.

 

 

쓰레드 생성자 메소드

start(): 쓰레드를 실행시킨다. 

destroy(): 쓰레드를 소멸시킨다.

getName(): 현재 실행중인 쓰레드의 이름을 얻는다.

setName(): 쓰레드의 이름을 지정한다. 

 

 

쓰레드 스케줄링 메소드

suspend(): 실행 가능 상태에서 대기 상태로

resume(): 대기 상태에서 실행 가능 상태로

sleep(): 명시된 시간만큼 쓰레드를 잠들게 함

wait(): 조건이 만족할 때 까지 쓰레드를 대기상태로 만듬 

 

 

[예제코드]

import java.applet.*;
import java.awt.*;
import java.util.Date;

 

public class Clock extends Applet implements Runnable{


    Thread thread;
    Font font;
 
    public void init(){


        thread=new Thread(this);
        font=new Font("Helvetica", Font.BOLD, 24);
    }
 
    public void start(){


        if(thread.isAlive()){
            thread.resume();
        }else{
            thread.start();
        }


    }
 
    public void stop(){
        thread.suspend();
    }
 
    public void destroy(){
        thread.stop();
    }
 
    public void run(){


        while(true){
           repaint();


           try{
                thread.sleep(1000);
           }catch(InterruptedException e){}
        }
    }
 
    public void paint(Graphics g){


        Date now=new Date();
        g.setFont(font);
        g.drawString(now.toString(), 15, 60);
        g.drawString(now.getHours()+":"+now.getMinutes()+":"+now.getSeconds(), 15,35);
    }

 

 

[사진] 위 예제 코드 실행 결과

 

GMT 시간으로 출력되는 부분을 한국시간으로 변환해서 출력하고자 한다면 Data 클래스를 선언하기 전에 System.setProperty("user.timezone", "Asia/Seoul") 으로 시간을 맞쳐주면 된다.

 

 

Clock.class

위에 파일은 System.setProperty("user.timezone", "Asia/Seoul") 를 사용한 예제이다.

 

Clock.class
0.0MB