코드 그라데이션

Day30-31. Thread(쓰레드) (1) 기본 개념 본문

Java/Mega

Day30-31. Thread(쓰레드) (1) 기본 개념

완벽한 장면 2023. 4. 26. 12:36

Thread(쓰레드)

- 프로세스 ? 쓰레드 ? 우리가 일상생활에서 종종 쓰는 말이다.

프로세스는 "하나의 프로그램 실행 단위"

쓰레드는 "프로세스 안에서 실행하는 실행 단위(프로세스를 돌리기 위한 실행 흐름 단위)"

- ex. 채팅을 보내면 보냄과 동시에 수신자에게도 채팅이 나타나죠.

프로세스와 쓰레드

 

기본, main도 쓰레드다!

프로세스 안에서 실행을 하는 단위 -> 쓰레드

 

쓰레드를 왜 쓰나요?

=> 속도 향상

- 쓰레드를 여러 개 만들어서 프로그램 작업을 좀 더 빠르게 수행을 하려고 씁니다.

그러나... 메모리 또는 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
완료! 스프링
완료! 자바

=> 순서 뒤죽박죽.

728x90
Comments