Day30-31. Thread(쓰레드) (1) 기본 개념
Thread(쓰레드)
- 프로세스 ? 쓰레드 ? 우리가 일상생활에서 종종 쓰는 말이다.
프로세스는 "하나의 프로그램 실행 단위"
쓰레드는 "프로세스 안에서 실행하는 실행 단위(프로세스를 돌리기 위한 실행 흐름 단위)"
- ex. 채팅을 보내면 보냄과 동시에 수신자에게도 채팅이 나타나죠.

프로세스 안에서 실행을 하는 단위 -> 쓰레드
쓰레드를 왜 쓰나요?
=> 속도 향상
- 쓰레드를 여러 개 만들어서 프로그램 작업을 좀 더 빠르게 수행을 하려고 씁니다.
그러나... 메모리 또는 CPU 자원 소모가 많아집니다.
ex. 쓰레드 =>> 종업원
종업원 여러명두면 가게를 더 빠르게 운영하면 돈을 더 많을 벌 수 있습니다.
단, 종업원이 일을 잘해야 됩니다.
종업원이 일을 잘하면 좋지만 아니면 종업원의 존재가 피해이겠죠.
* run() 함수는 쓰레드 내장 메서드다
-> 평소에 메서드명 지으면 안 됨.
1. new 로 쓰레드를 생성
2. start() 를 하면 run()이 작동해서 쓰레드가 실행.. 끝나면 종료.
But. 실행 도중에 join, sleep, wait 등으로 변동을 줌. 대기 상태로 변환
여기서 interrupt()를 해결하던가 함.
어떨 때는 A쓰레드와 B쓰레드를 실행할 때 A가 다 끝나고 B가 실행되어야 하는 경우도 필요할 수 있음.
(ex. 요리가 다 되어야 서빙을할 수 있듯이)
"너 서빙하는 친구 잠시 빠져있어봐" => wait() // "요리 다 되었으니 와서 서빙하도록 해" => notify() 다시 일 시작
notifyAll() 너 자고 있는 애 다 일어나봐.
예제 1 >
package Day30;
class ThreadTest extends Thread { // 일단 쓰레드를 만들려면 상속받아야 함.
public void run() { // run() 은 Thread에 있는데, 이걸 오버라이딩 한 것
for(int i = 1; i<=10; i++) {
System.out.println("자바 쓰레드 너무 쉬워요 : " + i);
}
// 쓰레드 스타트를 딱 누르는 순간 자동으로 run이 실행됨. 따로 run을 부르는 게 아니다.
}
}
public class ExThreadTest1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
ThreadTest tt = new ThreadTest(); // 쓰레드 생성
tt.start(); // 실행 -> run()
for(int i = 0; i<10; i++) {
System.out.println("쓰레드 어려워요!!!~!~!!");
} // 할 때마다 다르게 나옴. 순서가 일정하지 않다.,
}
}
실행 결과(할 때마다 달라짐)
쓰레드 어려워요!!!~!~!!
쓰레드 어려워요!!!~!~!!
자바 쓰레드 너무 쉬워요 : 1
자바 쓰레드 너무 쉬워요 : 2
쓰레드 어려워요!!!~!~!!
쓰레드 어려워요!!!~!~!!
쓰레드 어려워요!!!~!~!!
쓰레드 어려워요!!!~!~!!
쓰레드 어려워요!!!~!~!!
쓰레드 어려워요!!!~!~!!
쓰레드 어려워요!!!~!~!!
쓰레드 어려워요!!!~!~!!
자바 쓰레드 너무 쉬워요 : 3
자바 쓰레드 너무 쉬워요 : 4
자바 쓰레드 너무 쉬워요 : 5
자바 쓰레드 너무 쉬워요 : 6
자바 쓰레드 너무 쉬워요 : 7
자바 쓰레드 너무 쉬워요 : 8
자바 쓰레드 너무 쉬워요 : 9
자바 쓰레드 너무 쉬워요 : 10
=> 먼저 들어오는 애부터 찍어내기 때문에.
예제 2 >
package Day30;
class DThread extends Thread {
DThread(String str) {
setName(str); // 쓰레드 이름을 지정할 수 있다.
// 이건 쓰레드 안에 기본적으로 제공하는 메서드.
}
public void run() { // 무조건 4번형식이다 run은
for(int i = 1; i<=10; i++) {
System.out.println(getName() + i);
}
System.out.println("완료! " + getName());
}
}
public class ExDoubleThread1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
DThread t1 = new DThread("자바");
DThread t2 = new DThread("스프링");
t1.start();
t2.start();
System.out.println("바이바이");
// 이건 쓰레드 세 개 쓴 것. main 까지...!
}
}
실행 결과(이것도 할 때 마다 달라짐)
바이바이
스프링1
자바1
스프링2
자바2
스프링3
자바3
스프링4
자바4
자바5
스프링5
스프링6
자바6
스프링7
자바7
스프링8
자바8
스프링9
자바9
스프링10
자바10
완료! 스프링
완료! 자바
=> 순서 뒤죽박죽.