JAVA - 쓰레드를 생성하는 두 번째 방법
- JAVA
- 2018. 3. 16. 15:25
쓰레드 클래스의 정의를 위해서는 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까지의 합을 출력하고 있다.
'JAVA' 카테고리의 다른 글
JAVA - 쓰레드의 라이프 싸이클(Life Cycle) (0) | 2018.03.31 |
---|---|
JAVA - 쓰레드의 스케줄링과 쓰레드의 우선순위 컨트롤 (2) | 2018.03.31 |
JAVA - 쓰레드 (0) | 2018.03.16 |
JAVA - Collection<E> 인터페이스를 구현하는 제네릭 클래스 ArrayList 와 LinkedList (0) | 2018.03.04 |
JAVA - 컬렉션 프레임워크 (0) | 2018.03.04 |