괴발개발

[강의 정리]D45 JAVA(tread 제어, 컨트롤) 본문

BACK END/JAVA

[강의 정리]D45 JAVA(tread 제어, 컨트롤)

dinoelll 2023. 3. 15. 17:05

<1.thread 제어>


이유 : round robin 방식을 사용하기 때문. 

*round robin 특징
1. 걍 빠른 사람 순서대로이다.
2. memory를 공유해서 간섭효과가 생긴다

so, 싱크로나이즈 방식 채택!함
-> synchronized 방식
1)method - 오직 하나의 스레드만 입장 가능하게 한다.

public synchronized void setScore(int score) {
}


2) block - 메서드 안까지는 들어올 수 있다. but 특정 영역에 대해서는 줄을 세운다.

public void setScore(int score) {
		
    synchronized (this) {
    }
}


<2. thread의 3가지 상태 + 일시정지>


1. new - 객체 생성(Start 호출 전)
2. Runnable - 실행 걸려있는 상태! (실행 전)
3. Terminated - 실행을 마친 상태(실행 후)

+일시 정지 - waiting, timed_waiting, Bloking


<3. thread 컨트롤 4가지 방식>


1. sleep() : 일시정지 시킴(but 타이밍을 잘 맞춰야 한다.)
2. yield() : 기회를 주는것(기회를 공평하게 주는게 아니다.)
3. join() : 종료를 기다린 후 실행 할 때 사용. -> (join 해서 막는건 blocking이라고 한다.)

->1~100까지의 합.

계산해주는애, 찍어내는애 따로있꼬  join안해주면 걍 먼저 찍어내버려서 , 0을 찍어버린다.


4.

wait() : 자기 자신이 자는거

 notify()  : 자고 있는 한 명 깨우는거,

 notifyAll() : 자고 있는 애 다 깨우는거

 

5. stop flag, interrupt() : 

(stop은 너무 강제종료 해버려서, 쓰지 말라고함)

 

1. stop flag 활용 : stop flag 매서드 만들고  뭐  stopFlag.setStop(true); 이런식으로 써서 while 문 멈추게 한다. 

그냥 쓰면 사후처리가 안되서 이렇게 매서드 만들어서 처리하는 것임. (자세하게는 귀찮아서 못쓰겟음)

 

2. interrupt 활용

[방법 1] 인터럽트 예외 활용 1(sleep을 사용하고, try-catch를 활용해야한다.)

public class Inter extends Thread {

	@Override
	public void run() {
		
		//인터럽트 예외 활용1 (sleep을 사용하고, try-catch를 활용해야한다.)
		try {
			
			while(true) {
				System.out.println("inter thread 실행 중...");
				Thread.sleep(1);//sleep이 동작되는 동안은 인터럽트에 의한 예외가 발생할 수 있따.
				
			}
		} catch (InterruptedException e) {// 뭔가 멈추는게 발생하면 예외로 나오게 하는거
			System.out.println("자원 정리 또는 반납");
			System.out.println("안전하게 실행 종료");
		}
	
		}
public static void main(String[] args) throws InterruptedException {
	
	Inter inter = new Inter();
		inter.start();
		Thread.sleep(1000);
		inter.interrupt();//강제로 인터럽트exception 예외를 발생 시키는 메서드.
}

// 이 인터럽트는 sleep이란느게 있어야 예외로 처리 가능하지. (이건 모르겟는데, 이 sleep이라는
// 메서드 사용해주면 트라이 캐치 해주라고 막 문구 나오자나, 그런 의미에서 예외 발생시킬수 잇는
//조건이라고 하는거 아니겠음?>)

 

**그래서 조건은 sleep으로 예외 발생시키고, interrupt로 강제로 멈춰서 catch실행하게 해준거임.

 

 

[방법 2] /인터럽트 예외 활용 2

while(true) {
			while(true) {
				System.out.println("stop flag thread 실행 중...");
				
				if(Thread.interrupted()) {
					break;
				}
				
			}

 

🎇 단체로 중지하고 싶다면 interrupted가 나음. 그룹 때려서 멈췄냐? 하고 확인하면 됨

stopflag는 하나하나 지정해주는 불편함이 있음.

 

stop :  혼자 꺼버려서 절대 사용하면 안됨
stop flag : wile 문에서 false가 나왔을 때 종료시키는거

interrupt :
interttupted :

**** 주로 sleep과 join 사용해주고 , 가끔 wait과 notify 사용 해준다.

 

 

Comments