흐름 또는 단위
1) Thread 클래스 상속받기
2) Runnable 인터페이스 구현하기
public class Thread1 {
public static void main(String[] args) {
Thread1_1 t1 = new Thread1_1();
Runnable r = new Thread1_2();
Thread t2 = new Thread(r);
t1.start(); // 스레드 t1 실행
t2.start(); // 스레드 t2 실행
}
}
class Thread1_1 extends Thread {
public void run() {
for (int i = 0; i < 5; i++) {
// Thread 클래스 메서드 직접 호출 가능
System.out.println(getName());
}
}
}
class Thread1_2 implements Runnable {
@Override
public void run() {
for(int i = 0; i < 5; i++) {
// Runnable을 구현하면 Thread 클래스의 currentThread()를 호출하여
// Thread에 대한 참조를 얻어와서 호출해야 함
System.out.println(Thread.currentThread().getName());
}
}
}
실행결과
Thread-1
Thread-1
Thread-1
Thread-1
Thread-1
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
💡 start()가 호출되었다고 바로 실행되는 것이 아님, 일단 실행 대기 상태에 있다가 자신의 차례가 되어야 실행 상태가 됨
💡 하나의 스레드에 대해 start()는 한 번만 호출될 수 있음(두 번 실행 시 예외 발생)
@ main 메서드에서 run()을 호출하는 경우의 call stack
| |
----------
|run |
----------
|main |
----------
@ main 매서드에서 start()를 호출하는 경우
#step 1.
| |
----------
|start |
----------
|main |
----------
#step 2.
| | | |
---------- | |
|start | | |
---------- | |
|main | | |
---------- ----------
#step 3.
| | | |
---------- | |
|start | | |
---------- ----------
|main | |run |
---------- ----------
#step 4.
| | | |
| | | |
---------- ----------
|main | |run |
---------- ----------
#step 5.
| | | |
| | | |
| | ----------
| | |run |
---------- ----------
동기화
와 교착 상태
같은 문제들을 고려하며 프로그래밍 해야 함문맥 전환
을 할 경우가 프로세스끼리 문맥 전환
을 할 때보다 빠름(상대적으로 스위치 해야 할 메모리 영역이 적기 때문임)concurrent:병행
| A 작업 | B 작업 |
parallel:병렬
| A | B | A | B | A | B | A | B | A | B | A | B |
💡 싱글 코어에서 단순히 CPU만 사용하는 계산 작업이라면 Single Thread가 더 효율적임
💡 두 개의 스레드가 서로 다른 자원을 사용하는 작업의 경우 Multi Thread가 더 효율적임
Thread(ThreadGroup group, String name);
Thread(ThreadGroup group, Runnable target);
Thread(ThreadGroup group, Runnable target, String name);
void interrupt(); // 스레드의 interrupted 상태를 false에서 true로 변경
boolean isInterrupted(); // 스레드의 interrupted 상태를 변환
static boolean isInterrupted(); // 현재 스레드의 interrupted 상태를 알려주고 false로 초기화
위 내용은 다음 블로그를 참고하였습니다.