[자바 스레드] 86. 스레드

김건우's avatar
Feb 21, 2025
[자바 스레드] 86. 스레드
💡
스레드를 사용하는 이유
  • 동시에 무언가를 해야할 때
  • 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("메인 쓰레드 종료"); } }
notion image

예제 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.그림그리기(); } }
그림 그리기 완료 → 파일 쓰기 완료 → 그림 그리기 완료 순이 아닌
쓰레드가 실행 되어 그림 그리기 완료 → 그림 그리기 완료 → 파일 쓰기 완료 순으로 출력되는 걸 볼 수 있다
notion image

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(); } }
notion image
Share article

gunwoo