늘 겸손하게

Java Thread 기초 이론 본문

Programming/Java

Java Thread 기초 이론

besforyou999 2022. 2. 8. 22:15

 

안녕하세요 besforyou입니다

이번글은 자바 스레드 기초 입니다

 


 

스레드(thread)

 

- 운영체제에 의해 관리되는 하나의 작업 혹은 테스크

 


멀티 스레딩 ( Multi-threading )

 

- 하나의 응용 프로그램이 여러 개의 스레드를 생성하고, 각 스레드가 하나의 작업을 처리하는 기법을 말한다.

 

- 하나의 응용 프로그램에 속한 스레드는 변수 메모리, 파일 오픈 테이블 등 자원을 공유하므로, 문맥 교환(context-switch)에 따른 오버헤드가 매우 작다. 

 

- 대부분의 운영체제가 멀티스레딩을 기본으로 하고 있다.

 


멀티 프로세싱(Multi-processing) 과 멀티 스레딩 (multi-threading)

 

멀티 태스킹을 구현하는 기술은 멀티 프로세싱(multi-processing)과 멀티스레딩(multi-threading)이 있습니다.

멀티 프로세싱 기법은 여러 개의 프로세스를 만들고, 각 프로세스가 하나의 작업을 처리하는 기법이라면,

멀티 스레딩 기법은 여러 개의 스레드를 생성하고, 각 스레드가 하나의 작업을 처리하는 기법입니다.

 


대부분의 운영체제는 멀티스레딩이 기본

왜?

멀티프로세싱 기법에서 여러 개의 프로세스를 생성할때 각 프로세스가 독립된 메모리 영역을 보유하고, 프로세스 사이의 context-switch에 따른 오버헤드 크기가 큰 반면에 멀티스레딩 기법은 스레드가 같은 변수 메모리, 파일 오픈 테이블 등의 자원을 공유하므로 context-switch에 따른 오버헤드 크기가 작아 시간 소모가 적습니다.

 

그렇기 때문에 멀티스레딩이 대부분의 운영체제에서 기본입니다.

 


 

자바 스레드

- 자바 가상 기계(JVM)에 의해 스케줄되는 실행 단위의 코드 블럭

- 스레드의 생명 주기는 JVM에 의해 관리됨 : JVM은 스레드 단위로 스케줄링

 


JVM과 자바의 멀티스레딩

- 하나의 JVM은 하나의 자바 응용 프로그램만 실행

- 응용 프로그램은 하나 이상의 스레드로 구성 가능

 

결국 JVM이 여러 개의 스레드를 관리하므로 개발자는 스레드 코드를 작성하고 JVM이 스레드 코드를 실행하도록 하면 된다.

 

 


자바 스레드를 이용한 타이머 예제 코드

 

1. TimerThread.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import javax.swing.*;
 
public class TimerThread extends Thread {
    JLabel timerLabel;
    public TimerThread(JLabel timerLabel) {
        this.timerLabel = timerLabel;
    }
 
    public void run() {
        int n = 0;
        while (true) {
            timerLabel.setText(Integer.toString(n));
            n++;
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) { return ; }
        }
    }
}
 
cs

 

2. ThreadTimerEx.java

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import javax.swing.*;
import java.awt.*;
 
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(250,150);
        setVisible(true);
        th.start();
    }
    public static void main(String [] args) {
        new ThreadTimerEx();
    }
}
 
cs