프로그래밍 언어/JAVA

Thread 클래스를 상속받아 스레드 만들기

· 코딩마이데이

Thread 클래스의 경로명은 java.lang.Thread입니다. Thread 클래스상속받아 개발자의 스레드 코드를 만들 수 있습니다. Thread 클래스는 스레드를 만들고 유지 관리하기 위해 많은 메서드를 제공합니다.

Thread 클래스의 주요 메소드

 

스레드 클래스 작성: Thread 클래스 상속 

먼저 Thread를 상속받아 TimeThread 클래스를 작성합니다.

class TimeTread extends Thread { // Thread 상속받음
	...............................................
}

 

스레드 코드 작성: run() 메소드 오버라이딩

Thread의 run() 메서드를 오버라이딩합니다. run() 메서드에 작성된 코드를 스레드 코드라고 부른다. 스레드는 run()에서부터 실행을 시작하고 run()이 종료하면 스레드도 종료합니다. run()은 보통 메소드와 같은 방법으로 작성하면 됩니다.

class TimeThread extends Thread {
	@Override
	public void run() { // run() 오버라이딩
		..............................
   	}
}

 

만일 run()을 오버라이딩하지 않으면 Thread 클래스에 작성된 run()은 아무일도 하지 않고 단순 리턴하도록 작성되어 있어 스레드가 바로 종료됩니다.

Thread를 상속받아 1초 단위로 초 시간을 출력하는 TimeThread 스레드 작성

 

스레드 객체 생성

TimeTread th = new TimerThread(); // 스레드 객체 생성

 

스레드 객체를 생성한 것으로 스레드가 작동하는 곳은 아닙니다. 스레드 객체의 생성은 어디까지나 하나의 객체 생성에 불과합니다. 스레드는 다른 객체와 달리 JVM에 등록되어 JVM에 의해 스케줄링되어야 비로소 작동되는 것입니다.

 

스레드 시작: start() 메서드 호출

스레드 생성의 제일 중요한 마지막 과정은 스레드가 생명력을 가지고 실행을 사직하도록 하는 것입니다. Thread 클래스의 start() 메서드를 호출하여 스레드를 동작시킵니다.

th.start();

 

start() 메서드는 Thread 클래스에 구현된 메서드이며, 개발자가 오버라이딩하면 됩니다. start() 메서드는 생성된 스레드 객체를 스케줄링이 가능한 상태로 전환하도록 JVM에게 지시합니다. 이후 스케줄링에 의해 이 스레드가 선택되면 비로서 JVM에 의해 run() 메서드가 호출되어 실행을 시작합니다.

 

Thread를 상속받아 1초 단위로 출력하는 타이머 스레드 만들기

import javax.swing.*;
import java.awt.*;

class TimerThread extends Thread {
    private JLabel timerLabel; // 타이머 값이 출력되는 레이블

    public TimerThread(JLabel timerLabel) {
        this.timerLabel = timerLabel; // 타이머 카운트를 출력할 레이블
    }
    // 스레드 코드. run()이 종료하면 스레드 종료
    @Override
    public void run() {
        int n = 0; // 타이머 카운트 값
        while (true) { // 무한 루프
            timerLabel.setText(Integer.toString(n)); // 레이블에 카운트 값 출력
            n++; /// 카운트 증가
            try {
                Thread.sleep(1000);
            }
            catch (InterruptedException e) {
                return; // 예외가 발생하면 스레드 종료
            }
        }
    }
}

public class ThreadTimerEx extends JFrame{
    public ThreadTimerEx() {
        setTitle("Thread를 상속받은 타이머 스레드 예제");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container c = getContentPane();
        c.setLayout(new FlowLayout());

        // 타이머 값을 출력할 레이블 생성
        JLabel timerLabel = new JLabel();
        timerLabel.setFont(new Font("Gothic", Font.ITALIC, 80));
        c.add(timerLabel); // 레이블을 컨텐트팬에 부착

        // 타이머 스래드 객체 생성. 타이머 값을 출력할 레이블을 셍성자에 전달
        TimerThread th = new TimerThread(timerLabel);

        setSize(300, 170);
        setVisible(true);

        th.start(); // 타이머 스레드의 실행을 시작하게 한다.
    }

    public static void main(String[] args) {
        new ThreadTimerEx();
    }
}

 

[실행결과]