[JAVA] 자바 정복기 - 스레드

개발log·2024년 4월 7일

NEW 자바 정복기

목록 보기
23/27
post-thumbnail

스레드

프로세스 내부에서의 실행 흐름

  • 멀티 프로세스: 자신의 메모리를 가지고 실행하므로 서로 독립적
  • 멀티 스레드: 하나의 프로세스 내부에 생성되므로 스레드 하나가 예외를 발생시키면 다른 스레드도 영향을 받음

작업 스레드 생성과 실행

Thread 클래스로부터 직접 생성

class Task implements Runnable{
	public void run() {
    	스레드가 실행할 코드;
    }
}
  • 인터페이스 Runnable 구현 객체 생성 후, 이것을 매개값으로 한 Thread 생성자 호출해야 작업 스레드 생성됨
Runnable task = new Task();
Thread thread = new Thread(task);
  • start() 메소드 호출해야 실행
thread.start();

Thread 하위 클래스로부터 생성

public class WorkerThread extends Thread {
	@Override
    public void run() { //run() 메소드 재정의
    	스레드가 실행할 코드;
    }
}
Thread thread = new WorkerThread();
  • start() 메소드 호출해야 실행
thread.start();

스레드 이름

메인 스레드는 'main' 이름 가지며, 직접 생성한 스레드는 자동적으로 'Thread-n' 이름 설정됨

  • setName() 메소드로 변경 가능
thread.setName("스레드 이름");
  • getName() 메소드로 스레드 이름 알 수 있음
thread.getName("스레드 이름");
  • 현재 실행 중인 스레드 이름을 얻는 방법
  • currentThread() 메소드로 현재 스레드의 참조 얻을 수 있음
Thread thread = Thread.currentThread();

동기화 메소드

멀티 스레드에서 공유 객체를 사용할 때 주의할 점

  • 스레드들이 객체를 공유해서 작업해야 하는 경우 의도했던 것과 다른 결과 나올 수 있음

동기화 메소드

public synchronized void method(){
	임계 영역 // 단 하나의 스레드만 실행
}
  • 메소드를 호출하는 스레드는 단 하나임을 보장
    • 동기화 메소드를 하나의 스레드가 호출하고 있을 때 다른 스레드는 동기화 메소드를 호출할 수 없음
    • 객체 잠금이 일어나므로 다른 동기화 메소드도 실행할 수 없음
    • 일반 메소드는 언제든지 호출 가능
    • 동기화 메소드를 적용한 경우

멀티 스레드 정리

  • 프로세스: 운영체제로부터 실행에 필요한 메모리를 할당받아 실행하는 애플리케이션
  • 멀티 스레드: 하나의 프로세스 내에 동시에 실행하는 스레드가 2개 이상인 경우
    -메인 스레드: 자바의 모든 애플리케이션은 메인 스레드가 main() 메소드를 실행
  • 작업 스레드: 메인 작업 이외에 병렬 작업의 수만큼 생성하는 스레드
    • Thread 클래스를 직접 객체화해서 생성할 수 있고
    • Thread 클래스를 상속해서 하위 클래스 만들어 생성할 수도 있음
  • 동기화 메소드: 한번에 하나의 스레드만 호출할 수 있도록 해주는 메소드

스레드 제어

스레드 상태 제어

  • 실행 중인 스레드의 상태를 변경
  • 스레드 상태를 변화시키는 메소드가 있음
메소드설명
interrupt()일시 정지 상태의 스레드에서 InterruptedException을 발생시켜, 에외 처리 코드(catch)에서 실행 대기 상태로 가거나 종료 상태로 갈 수 있도록 합니다.
sleep(long millis)주어진 시간 동안 스레드를 일시 정지 상태로 만듭니다. 주어진 시간이 지나면 자동적으로 실행 대기 상태가 됩니다.
stop()스레드를 즉시 종료합니다. 불안전한 종료를 유발하므로 사용하지 않는 것이 좋습니다.

주어진 시간 동안 일시 정지

  • Thread 클래스의 정적 메소드 sleep() 사용
try {
	Thread.sleep(1000);
} catch(InterruptedException e) {
	//interrupt() 메소드가 호출되면 실행
}

스레드 종료

안전한 종료를 위한 방법

  • stop 플래그를 이용하는 방법
  • interrupt() 메소드를 이용하는 방법
  • stop 플래그를 이용하는 방법
public class XXXThread extend Thread {
	private boolean stop;
    
    public void run() {
    	while(!stop) { //stop이 true가 되면 run()이 종료
        	스레드가 반복 실행하는 코드;
        }
        //스레드가 사용한 자원 정리
    }
}
  • interrupt() 메소드 이용하는 방법
    • ThreadA가 ThreadB의 interrupt() 메소드 실행한 이후,
      1) 일시 정지가 있는 경우: 일시정지 상태 될 때 InterruptedException 발생
      2) 일시 정지가 없는 경우 다음 메소드의 return 같이 true가 됨
      Interrupted() - 정적 메소드, 현재 스레드가 interrupted 되었는지 확인
      isInterrupted() - 인스턴스 메소드, 현재 스레드가 interrupted 되었는지 확인

데몬 스레드

  • 데몬(daemon) 스레드
  • 주 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드
  • 주 스레드가 종료되면 자동으로 종료되는 스레드
  • 주 스레드에서 보조 스레드 객체의 setDaemon(true)를 호출해서 설정함
  • 보조 스레드가 start() 하기 전에 데몬 스레드로 설정
public static void main(String[] args) {
	AutoSaveThread thread = new AutoSaveThread();
    thread.setdaemon(true);
    thread.start();
    ...
}

스레드 제어 정리

  • 스레드 상태: 스레드를 생성하고 시작하면 스레드는 다양한 상태를 가지게 된다.
  • 일시 정지: Thread.sleep() 메소드를 호출한 스레드는 주어진 시간 동안 일시정지 상태가 되고 다시 실행 대기 상태로 돌아감
  • 안전한 종료: 스레드를 안전하게 종료하기 위해 stop 플래그나 interrupt() 메소드를 이용할 수 있다.
  • 데몬 스레드: 주 스레드가 종료되면 자동으로 종료되는 스레드
profile
나의 개발 저장소

0개의 댓글