Thread(쓰레드)

최동민·2022년 5월 31일
0

JAVA

목록 보기
12/13

Thread (쓰레드)

- 프로그램

: 프로그래밍 언어로 구성된 소스코드로 만든 것

- 프로세스

: 프로그램을 실행시켜 동작하기 위한 자원을 생성하여 일련의 처리 경로를 의미한다. (직렬적)
사용가능하도록 올려만 주는 아이. 그 올라간 자원을 사용하는 것이 쓰레드.

직렬적 : 하나가 처리가 되어야 다음 것이 처리가 되는 것

- 쓰레드

: 프로그램을 실행시켜 동작하고 있는 것 (직렬적)
자원 사용
프로세스 없이 쓰레드 할 수 없다.

- 멀티 쓰레드

(분업)
쓰레드가 하나의 프로세스를 동시에 처리하는 것처럼 보이지만 사실은 매우 짧은 단위의 시간으로 분할하여 차례로 처리한다 (병렬적)
여러개의 경로를 가질 수 있게 한다.
한 개의 처리경로를 여러개로 나누어 동시 작업 가능

아주 짧은 시간 단위로 분할을 하고, 우리 눈에는 동시에 작업 중인 걸로 보인다.

교착 상태

: 멀티 쓰레드 중 쓰레드 간에 대기 상태가 종료되지 않아 무한정 대기만 하는 비정상적인 상태

오라클DB는 교착 상태에 빠지면 60초를 기준으로 교착상태를 판단하여 자동으로 재시작 혹은 일부를 끊는다.

해결방안 : (부장님께 보고한다)
조건문 등을 이용해 교착 상태를 다시 깨워준다. (굉장히 어려움)

한명이 안고 다 기다려, 한명이 안고 다 기다려, 그러다가 갑자기 다 기다리는 경우가 있다. 프로그램이 멈추는 것. 즉 무한대기 상태. 이를 교착 상태라고 한다. 10초 가량이 멈춘다고 했을 때. 만약 은행에서 이와 같은 일이 발생한다면 큰 문제가 생길 것.


멀티 쓰레드

sleep();

컴파일러가 하나의 쓰레드. 거기다 sleep이란 걸 실행.
그럼 우리 눈에는 동시에 생기는 것처럼 보임.
sleep은 trycatch로 잡아주는데 왜 예외처리 해주는걸까?
기존의 로직이 망가지기 때문에. 내가 작업을 하는데 멈추니까. 즉 방해하는 것처럼 나타난다.

Thread 클래스 상속

Runnable 인터페이스 구현


Thread클래스를 상속해보겠다.

Thread 클래스를 상속하기 때문에 run을 재정의할 수 있으며, sleep을 내 것처럼 사용할 수 있다.

출력 결과는

start();

멀티쓰레드를 할 때에는 start를 사용해주어야 한다.
start() : 내부적으로 쓰레드를 발생시키면서 run함수를 호출시킨다.

확인해보면


Runnable 인터페이스를 구현해보자

t1.start(); 하니까 안된다. 왜?

start 구현은 Thread에 되어있다.
그럼 Runnable을 implements 받은 객체(t1,t2)를 Thread에게 전달해주어야 한다. Thread를 객체화하자


이번엔 쓰레드에 이름을 줘보도록 하겠다. super는 부모. 즉 Thread

사실상 우리가 항상 쓰던 메인도 쓰레드이다.
고로 출력했을 때 가장 먼저 실행되는 쓰레드는 메인이다.

System.out.println("main 종료");
// 이게 먼저 실행된다는 것 

main을 맨 마지막에 뽑기 위해서는 위와 같이 join(); 을 사용하면 된다

내가 현재 실행 중인 쓰레드에다 join을 걸어주면 그 밑에 있는 로직은 그게 끝날 때까지 기다린다. 그래서 sleep이 아닌 join을 써주어야 한다.
쓰레드를 순차적으로 하나하나 끝난 다음에 하나를 발생시킬 때에는 join을 써주어야 하고, 이 join도 다른 쓰레드를 멈춰주고 대기상태로 만드는 것이기 때문에 InterruptedException이 발생하기 때문에 try catch로 묶어주어야 한다.

join()

: 쓰레드 사용시 쓰레드 종료 전에 다른 로직 수행 시 치명적인 예기치 못한 오류 발생. 그러므로 join() 사용 시 밑에 로직들은 쓰레드가 종료 될 때까지 기다린 후 실행된다.


고양이 오리 돼지 클래스를 만들고 각각 울음소리 추가
Zoo 클래스에서 고양이 돼지가 10번 같이 울고 난 뒤 오리가 울게 만들기

package threadzoo;

public class Zoo {
	
public static void main(String[] args) {
		
		Pig p = new Pig();
		Cat c = new Cat();
		Duck d = new Duck();
		
		Thread threadP = new Thread(p);
		Thread threadC = new Thread(c);
		Thread threadD = new Thread(d);
		
		threadP.start();
		threadC.start();
		
		try {
			threadP.join();
			threadC.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		
		threadD.start();	
	}
}

profile
코드를 두드리면 문이 열린다

0개의 댓글