스레드를 사용하는 이유
- 동시에 무언가를 해야할 때
- I/O 때문에 멍 때리면서 느려지는 걸 해결할때
스레드의 단점
- 스레드를 한다고 속도가 빨라지는게 아님
- context swiching 때문에 스레드 객체가 많아지면 느려짐
프로세스 : 운영체제에서실행 중인 하나의 애플리케이션을 말한다. 사용자가 애플리케이션을 실행하면 운영체제로부터 실행에 필요한 메모리를 할당받아 애플리케이션의 코드를 실행하는 것을 말한다.
Thread : 하나의 스레드는 하나의 코드 실행 흐름을 뜻한다. 한 프로세스 내에 스레드가 2개라면 2개의 코드 실행 흐름이 생긴다는 의미이다.
메인 스레드 : 자바의 모든 애플리케이션은 이 메인 스레드가 main() 메소드를 실행하면서 시작된다. 메인 스레드는 main() 메소드의 첫 코드부터 아래로 순차적으로 실행하고, main() 메소드의 마지막 코드를 실행하거나 return 문을 만나면 실행이 종료된다.
멀티 스레드 : 하나의 프로세스 내에 여러 개의 스레드를 가지는 경우
여러작업을 동시에 작업할 수 있는 효과를 볼 수 있지만 → 하지만 동시에 작업 하는 것을 의미하지는 않다. 그렇게 느끼게 한다는 것
프로세스 간에는 자원 공유할 수 없지만 스레드 간 자원 공유는 가능하다
1. 스레드 기본
package ex19;
public class Th01 {
public static void main(String[] args) {// CPU -> 메인 쓰레드
Thread t1 = new Thread(() -> {
// 분신 1
for (int i = 0; i < 10; i++) {
System.out.println("분신 1 : " + i);
try {
Thread.sleep(1000); // 0.5초
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
});
t1.start();
// 분신 2
Thread t2 = new Thread(() -> {
for (int i = 0; i < 10; i++) {
System.out.println("분신 2 : " + i);
try {
Thread.sleep(500); // 0.5초
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
});
t2.start();
// 분신 3
Thread t3 = new Thread(() -> {
for (int i = 0; i < 10; i++) {
System.out.println("분신 3 : " + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
});
t3.start();
System.out.println("메인 쓰레드 종료");
}
}
예제 2.
package ex19;
// 화가
class MyFile {
public void write() {
try {
Thread.sleep(5000);
System.out.println("파일 쓰기 완료");
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
class 화가 {
public void 그림그리기() {
System.out.println("그림 그리기 완료");
}
}
public class Th03 {
public static void main(String[] args) {
MyFile myFile = new MyFile();
화가 painter = new 화가();
painter.그림그리기();
new Thread(() -> {
myFile.write();
}).start();
painter.그림그리기();
}
}그림 그리기 완료 → 파일 쓰기 완료 → 그림 그리기 완료 순이 아닌
쓰레드가 실행 되어
그림 그리기 완료 → 그림 그리기 완료 → 파일 쓰기 완료 순으로 출력되는 걸 볼 수 있다

3. 스레드 콜백 함수
package ex19;
//콜백
// (1) 콜백 메서드 만들기=
interface Callback {
void 입고(int qty); // 리턴 받고싶은 파라미터를 만들어주면 된다.
}
class Store implements Runnable {
Integer qty;
Callback callback;
// (2) 리턴이 필요한 곳으로 가서 콜백 메서드 전달받기
public Store(Callback callback) {
this.callback = callback;
}
@Override
public void run() {
// 통신 -> 다운로드
try {
Thread.sleep(100);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
qty = 5;
callback.입고(qty); //(3) 종료시 콜백 메서드 호출
}
}
/*
스레드에서 받은 데이터를 리턴 받아서 응용하고 싶을때!!
1. 타이밍 맞추기 (임시방편 - 그래도 쓰는 사람 많음)
2. 리스너 (부하가 너무 큼)
3. 콜백 (제일 좋음)
*/
public class Th06 {
public static void main(String[] args) {
int totalQty = 10;
Store store = new Store(qty -> {
System.out.println("재고수량 :" + (qty + totalQty));
});
Thread t1 = new Thread(store);
t1.start();
}
}
Share article