JAVA - 쓰레드를 생성하는 두 번째 방법

쓰레드 클래스의 정의를 위해서는 Thread 클래스를 상속해야만 한다.

때문에 쓰레드 클래스가 상속해야 할 또 다른 클래스가 존재한다면,

이는 문제가 아닐 수 없다. 따라서 자바는 쓰레드를 생성하는 방법으로

인터페이스의 구현을 통한 방법을 제시한다.

인터페이스를 통한 다중상속의 효과에 해당하는 예로도 볼수 있다.

복잡한 방법은 아니니 아래의 소스를 통해 보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
class Sum
{
        int num;
        public Sum() { num = 0; }
        public void addNum(int n) { num+=n; }
        public int getNum() { return num; }
}
class AdderThread extends Sum implements Runnable
{
    int start, end;
    public AdderThread(int s, int e)
    {
        start = s;
        end = e;
    }
    public void run()
    {
        for(int i=start; i<=end; i++)
            addNum(i);
    }
}
 
public class thread {
 
    public static void main(String[] args) {
        AdderThread at1 = new AdderThread(1,50);
        AdderThread at2 = new AdderThread(51,100);
        
        Thread tr1 = new Thread(at1);
        Thread tr2 = new Thread(at2);
        
        tr1.start();
        tr2.start();
        
        try{
            tr1.join();
            tr2.join();
        }
        catch(InterruptedException e)
        {
            e.printStackTrace();
        }
        
        System.out.println("1~100까지의 합 :  " + (at1.getNum()+at2.getNum()));
        
    }
 
}
cs

8,16line 에서 Sum클래스를 상속하면서 Runnable 인터페이스를
구현하고 있다. 이 인터페이스는 run메소드 하나로 이뤄져 있다.
26,27line에서 Runnable인터페이스를 구현하는 AdderThread 클래스의
인스턴스 두 개를 생성 하고있다. 하지만 이 인스턴스를 대상으로
start메소드를 호출할 순 없다. start메소드는 Thread 클래스의
메소드이기 때문이다.

29,30line에서는 Runnable인터페이스를 구현하는 인스턴스를 대상으로
쓰레드의 생성방법을 보이고 있다. 이렇듯 Runnable인터페이스를 구현하는
인스턴스의 참조 값을 전달받을 수 있는 생성자가 Thread클래스에 정의되어 있다.
바로 이 생성자를 통해서 클래스의 인스턴스를 생성해야 한다.
결국은 Thread클래스의 인스턴스가 생성되었다는 점에 주목해야한다.

36,37line에서 쓰레드 인스턴스를 대상으로 join메소드를 호출하고 있다.
이는 해당 쓰레드가 종료될 때까지 실행을 멈출 때 호출하는 메소드이다.
결과적으로 tr1과 tr2가 참조하는 두 쓰레드가 종료되어야 44line을 실행하게 된다.

44line에서는 두 쓰레드가 실행되면서 만들어 놓은 결과값을 참조하여
1부터 100까지의 합을 출력하고 있다.






댓글

Designed by JB FACTORY