스레드 만들어 실행하기

Copyright (c) 2015-, All Rights Reserved by Kwanghoon Choi
(아래 자바 프로그래밍 강의 교재의 내용을 자유롭게 이용하되 다른 웹 사이트 등을 통한 배포를 금합니다.)

1. 스레드 (Thread)의 정의와 실행

스레드는 프로그램 실행의 단위로, 각각의 스레드는 독립적인 프로그램 실행 환경(Program Counter)를 비롯한 레지스터들, 스택, 등)을 갖추고 있다. 하나의 태스크를 독립적으로 수행하기 위한 방법으로 활용할 수 있다. 여러 스레드가 동시에 실행될 때는 정해진 우선 순위에 따라 CPU 자원을 할당 받는 순서와 횟수를 조정한다. Java언어에서 java.lang 패키지의 Thread 클래스는 스레드를 표현한다. 프로그래머가 원하는 태스크를 수행하는 스레드 클래스를 만드는 두 가지 방법이 있다. - Thread 클래스를 상속 받고 run 메소드를 새로 정의하여 새로운 클래스를 만든다. - Runnable (java.lang 패키지의) 인터페이스의 run 메소드를 구현하여 새로운 클래스를 만든다.

class MyThread extends Thread {
    public void run() {
        // MyThread code is here
    }
}

class MyImplementation implements Runnable {
    public void run() {
        // MyImplementation code is here
    }
}

스레드 클래스를 정의한 다음 객체를 만들어 실행하려면 Thread 클래스의 start 메소드를 호출한다.

new MyThread().start(); // 스레드를 하나 만들어 독립적으로 실행
new Thread(new MyImplementation()).start(); // 두번째 스레드를 만들어 실행

지금까지 설명한 스레드를 정의해서 실행하기까지의 과정을 담은 예제 프로그램은 다음과 같다.

package com.example.java;

public class ThreadTest {

    public static void main(String[] arg )
    {
        new MyThread().start();
        new Thread( new MyImplementation() ).start();
    }
}

class MyThread extends Thread {
    public void run() {
        // MyThread code is here
    }
}

class MyImplementation implements Runnable {
    public void run() {
        // MyImplementation code is here
    }
}

여러 스레드를 번갈아가면서 동시에 실행하는 과정을 확인하기 위해 각 run 메소드에 간단한 메시지를 출력하는 문장을 추가해보자.


class MyThread extends Thread {
    public void run() {
        for (i=0; i<10; i++)
            System.out.println("MyThread");
    }
}

class MyImplementation implements Runnable {
    public void run() {
        for (i=0; i<10; i++)
            System.out.println("MyImplementation");
    }
}

이 프로그램을 실행했을때 예상되는 결과는 "MyThread"와 "MyImplementation"을 각각 10회 출력하고 그 순서는 두 스레드가 어떠한 순서대로 실행되었는가에 따라 결정될 것이다. 참고로 Java에서 스레드를 정의하는 방법이 상속을 이용하는 것과 구현하는 것, 두 가지인 이유는 다음과 같다. 다중 상속에서 두 부모가 동일한 메소드를 정의할 때 어느 메소드를 선택할지 결정하기 어려운 문제를 해결하고자 Java 언어는 단일 상속 만을 지원하도록 설계되었다. 그 결과가 extends로 지정할 수 있는 클래스는 반드시 하나라는 것이다. 따라서 Java에서 스레드를 정의하는 클래스가 이미 다른 클래스를 상속받아 정의한다면 Thread 클래스를 다중 상속 받을 수 없다. 이러한 문제를 해결하고자 Runnable 인터페이스를 구현해서 스레드를 만드는 방법을 사용할 수 있게 되었다.

 

Leave a Reply

Your email address will not be published. Required fields are marked *