Thread
프로세스
실행 중인 프로그램이다.
프로그램이 실행되면 운영체제로부터 메모리를 할당받아 프로세스가 된다
스레드
하나의 프로세스는 하나 이상의 스레드를 가진다.
실제 작업을 수행하는 단위는 스레드다
multi-thread
여러 스레드가 동시에 수행되는 프로그래밍, 여러 작업이 동시에 실행되는 효과
스레드는 자신만의 작업 공간을 가진다 (context)
스레드 사이에서 공유하는 자원이 있다 (자바에서는 static instance)
여러 스레드가 자원을 공유하는 경우, 서로 자원을 차지하려는 race condition이 발생할 수 있다
여러 스레드가 경쟁하는 자원을 critical section이라고 한다
critical section에 대한 동기화를 구현하지 않으면 오류가 발생할 수 있다
Thread 만들기
Thread 클래스 상속
class MyThread extends Thread {
@Override
public void run() {
System.out.println(Thread.currentThread());
for (int i = 0; i < 200; i++) {
System.out.print(i + " ");
}
}
}
Runnable 인터페이스 구현
class MyThread2 implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread());
for (int i = 0; i < 200; i++) {
System.out.print(i + " ");
}
}
}
실행 클래스를 다음과 같이 만들어 실행해본다
class ThreadTest2 {
public static void main(String[] args) {
System.out.println("main start");
MyThread2 mth = new MyThread2();
Thread th1 = new Thread(mth);
th1.start();
Thread th2 = new Thread(mth);
th2.start();
}
}
2개의 스레드가 번갈아가면서 실행된다
Thread Status
Runnable
스레드가 시작되면 스레드풀에 들어간다
스레드풀에 있는 스레드들은 CPU 할당 받기를 기다린다
이 스레드들은 Runnable 상태이다
Dead
스레드가 다 수행이되서 끝나면 Dead 상태가 된다
Not Runnable
CPU를 점유할 수 없는 상태다
영원히 이 상태면 좀비가 된다
Runnable에서 Not Runnable로 가는 경우가 3가지 있다
sleep
시간이 지나면 다시 Runnable 상태가 된다
wait, notify
리소스가 한정되있고 여러 스레드가 있을때, 리소스가 사용가능할 때까지 스레드를 대기시킨다
리소스가 유효한상태면 프로그램에서 notify를 통해 Not Runnable 스레드들 중 하나가 다시 Runnable 상태가 된다
join
A 스레드가 B 스레드에 대해 join을 걸면 A 스레드는 Not Runnable 상태가 된다
B 스레드가 작업을 종료하면 A 스레드가 다시 Runnable 상태가 된다
'Java' 카테고리의 다른 글
멀티 Thread 동기화 (0) | 2024.08.22 |
---|---|
Thread 클래스의 여러 메소드 (0) | 2024.08.15 |
여러가지 보조 스트림 (0) | 2024.08.10 |
Wrapper 클래스 (0) | 2024.05.21 |
스레드 (0) | 2024.05.20 |