230525_

hoy_·2023년 5월 25일
0

Today, I Learned

목록 보기
7/36

1. 오늘의 일정

  1. 문제 풀면서 강의 진도 나갔다.

  2. 교재 요약집 훑어보며 복습.




2. 배운 내용

  1. 쓰레드의 상태에 대한 이해,
  2. 쓰레드 구현 시 유의할 사항 학습.
    • 쓰레드의 실행 상태에 관여하는 메소드 중 static 제어자가 붙은 메서드들이 중요해보인다.

sleep()

static void sleep(long millis)
static void sleep(long, int nanos)

지정된 시간동안 쓰레드를 멈추게 하는 sleep()

sleep()에 의해 일시정지 상태가 된 쓰레드는 지정된 시간이 다 되거나 interrupt()가 호출되면, InterruptedException이 발생되어 실행대기 상태가 된다.
따라서 sleep()을 호출해야 할 때는 항상 try-catch문으로 예외를 처리해줘야 한다.

try{
	Thread.sleep(1,5000){
    } catch(InterruptedException e){}

매번 예외처리를 하는 것이 번거롭기 때문에 try-catch문을 포함하는 메서드를 만들어 사용하기도 한다.


interrupt()

쓰레드에게 작업을 멈추게 하는 interrupt()
멈추라고 요청할 뿐 강제로 종료시키지는 못한다.

void interrupt()	// 쓰레드의 interrupted상태를 false에서 true로 변경
boolean isInterrupted()	// 쓰레드의 interrupted상태를 반환
static boolean interrupted()
				//현재 쓰레드의 interrupted상태를 반환 후, false로 변경

이름이 비슷해 헷갈릴 수 있다.

Thread th = new Thread();
        th.start();
        ...
        th.interrupt(); // 쓰레드 th에 interrupt() 호출
        ...
        class MyThread extends Thread {
            public void run() {
                while (!interrupted()) { 
                // interrupted()의 결과가 false인 동안 반복
                }
            }
        }

static을 주의할 것!

static이 붙은 sleep(), interrupted()는 모두 현재 쓰레드 즉, 자기 자신의 상태를 변경하는 메서드다.
객체이름.메서드()의 형태로 호출하게 되면 해당 메서드를 관여하는 것이라는 착각을 하게 될 수도 있다.
따라서 Thread.sleep()의 형태로 호출하는 것이 바람직하다.




3. 발생한 오류

  1. 해당 없음




4. 앞으로의 나는

  1. 동기화에 관한 것을 머리로는 이해하고 있다고 생각했는데, 막상 손으로 쳐보니 버벅거리기만 한다.
  2. 이론을 배우는 것도 좋지만 직접 코드 한 줄 더 쳐보는 게 도움이 될 수도 있겠다.
  3. 하루 최소 한 문제씩 풀어보며 손으로 적는 코딩을 해야겠다.
profile
배우는 사람

0개의 댓글