[자바 기초] Thread

스레드 Thread : 특정 프로세스 내에서 실행되는 특정한 흐름


프로그램은 하나 이상의 스레드로 동작한다.

예를 들어 어떤 영상을 보여주며, 소리가 나오는 프로그램 이라면,

영상이 출력되는 스레드와 소리가 출력되는 스레드가 아주 짧은 시간을 단위로 번갈아 가며 실행 되며 동시에 출력되는 것 처럼 동작한다.


1. 스레드 사용법 : 스레드 Thread 클래스 상속

- 스레드 Thread 클래스를 일반 클래스에 상속하여 사용하는 방법

- 상속 시, run() 메소드의 오버라이딩 및 생성이 필요

- 스레드는 실행 시, start() 메소드를 사용함


예제 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Sample extends Thread {
    int seq;
 
    public Sample(int seq) {
        this.seq = seq;
    }
 
    public void run() {
        System.out.println(this.seq + " thread start.");  // 스레드 시작
        try {
            Thread.sleep(1000);  // 1초 대기, sleep 메소드의 경우 예외 처리문이 필요함
        } catch (Exception e) {
        }
        System.out.println(this.seq + " thread end.");  // 스레드 종료 
    }
 
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {  // 총 10개의 스레드 생성(0~9)
            Thread t = new Sample(i);
            t.start(); // 스레드 실행
        }
        System.out.println("main end.");  // main 메소드 종료
    }
}
cs

※출처 : https://wikidocs.net/230


실행 결과
- 반복문 for 문에 의해 0~9의 순서로 스레드 생성 및 문자열 출력
- 스레드 동작에 의해 중간에 "main end" 문자열 출력
- 각 스레드 종료 시점은 순서 없음














2. 스레드 사용법 : Runnable 추상 클래스 상속

- thread 클래스를 상속하여 run() 메소드를 구현 하는 것의 단점은 하나의 클래스만 상속이 가능하다는 것이다.(extends)
- runnable 의 경우 추상 클래스이기에 run() 메소드를 구현 함으로써 다중 상속이 가능하다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Sample implements Runnable {
    int seq;
 
    public Sample(int seq) {
        this.seq = seq;
    }
 
    public void run() {
        System.out.println(this.seq + " thread start.");  // 쓰레드 시작
        try {
            Thread.sleep(1000);  // 1초 대기한다.
        } catch (Exception e) {
        }
        System.out.println(this.seq + " thread end.");  // 쓰레드 종료 
    }
 
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {  // 총 10개의 쓰레드를 생성하여 실행한다.
            Thread t = new Thread(new Sample(i));
            t.start();
        }
        System.out.println("main end.");  // main 메서드 종료
    }
}
cs
※ 작성 방법의 차이지 있지만, 추상 클래스이기에 다중 상속이 가능하며, thread 클래스 상속일때의 동작과 큰 차이는 없다

댓글