괴발개발
[강의 정리]D45 JAVA(tread 제어, 컨트롤) 본문
<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 사용 해준다.
'BACK END > JAVA' 카테고리의 다른 글
[코드리뷰] Socket - (Server, Clinet) (0) | 2023.03.16 |
---|---|
[퀴즈 정리] D-45 JAVA(tread 제어, 컨트롤) (0) | 2023.03.15 |
<ZAVA I.O 사용해서 파일 복사하는 2번째 방법> (0) | 2023.03.14 |
varStatus와 .index (0) | 2023.03.07 |
[퀴즈 정리]D37 JAVA 문자열과 예외처리,Buffer,컬렉션 프레임워크 (0) | 2023.03.07 |