JAVA/자바의 정석

[자바의 정석 - 기초편] 13. (1) 쓰레드 ( 구현 / 실행 / IO 블락킹 / 우선순위 / 그룹 / 데몬 쓰레드 / 상태 )

서영22 2023. 12. 20. 20:15

 프로세스와 쓰레드 (process & thread) 

프로세스 : 실행 중인 프로그램, 자원(resources)과 쓰레드로 구성

 

쓰레드 : 프로세스 내에서 실제 작업을 수행

              모든 프로세스는 최소한 하나의 쓰레드를 갖고 있음

 

프로세스 : 쓰레드 = 공장 : 일꾼

하나의 새로운 프로세스 생성하는 것보다 하나의 새로운 쓰레드를 생성하는 것이 좋음

 

 

 

싱글 쓰레드 프로세스

= 자원 + 쓰레드

 

 

멀티 쓰레드 프로세스

= 자원 + 쓰레드 + 쓰레드 + ... + 쓰레드

 

 

 

 

 멀티쓰레드의 장단점 

장점

 

1. 자원을 보다 효율적으로 사용 가능

 

2. 사용자에 대한 응답성(responseness)이 향상됨

 

3. 작업이 분리되어 코드가 간결해짐

 

 

 

단점

 

1. 동기화에 주의해야 함

 

2. 교착상태가 발생하지 않도록 주의해야 함

 

3. 각 쓰레드가 효율적으로 고르게 실행될 수 있게 해야 함

 

 

 

 쓰레드의 구현 

1. Thread 클래스를 상속 

자바는 단일 상속이라 1번보다 2번으로 하는게 좋긴 함

class MyThread extends Thread {
        public void run() {  // Thread클래스의 run()을 오버라이딩
              /*  작업내용  */
        }
}

MyThread t1 = new MyTread();  // 쓰레드의 생성
t1.start();  // 쓰레드의 실행

 

 

2. Runnable 인터페이스를 구현

public interface Runnable {
       public abstract void run();
}

class MyThread2 implements Runnable {

        public void run() {  // Runnable인터페이스의 추상메서드 run()을 구현
              /*  작업내용  */
        }
}

Runnable r = new MyTread2();
Thread t2 = new Thread(r);  // Thread(Runnable r)
// Thread t2 = new Thread(new MyTread2());  // 위의 두줄을 한줄로 쓰면
t2.start();

 

 

 

 쓰레드의 실행 - start() 

쓰레드를 생성한 후에 start()를 호출해야 쓰레드가 작업을 시작함

ThreadEx1_1 t1 = new ThreadEx1_1();  // 쓰레드 t1 생성
ThreadEx1_1 t2 = new ThreadEx1_1();  // 쓰레드 t2 생성

t1.start();  // 쓰레드 t1 실행
t2.start();  // 쓰레드 t2실행

 

실행 순서를 결정하는 것은 OS 스케줄러

   ➔ start()했다고 바로 시작하는 것 아님. 먼저 start() 했다고 먼저 시작하는 것 아님

 

 

 

 start() 와 run() 

 

 

 

 싱글쓰레드 VS 멀티쓰레드 

 

 

 

 쓰레드의 I/O 블락킹 

 

 

 

 

 쓰레드의 우선순위 (priority of thread) 

- 작업의 중요도에 따라 쓰레드의 우선순위를 다르게 하여 특정 쓰레드가 더 많은 작업시간을 갖게 할 수 있음

(100%는 아님. 참고용)

 

 

 

 

 

 쓰레드 그룹 

- 서로 관련된 쓰레드를 그룹으로 묶어서 다루기 위한 것

 

- 모든 쓰레드는 반드시 하나의 쓰레드 그룹에 포함되어 있어야 함

 

- 쓰레드 그룹을 지정하지 않고 생성한 쓰레드는 'main 쓰레드 그룹'에 속함

 

- 자신을 생성한 쓰레드 (부모 쓰레드)의 그룹과 우선순위를 상속받음

 

 

 

 쓰레드 그룹의 메서드 

 

 

 

 

 데몬 쓰레드 (daemon thread) 

- 일반 쓰레드의 작업을 돕는 보조적인 역할을 수행

 

- 일반 쓰레드가 모두 종료되면 자동적으로 종료됨

 

- 가비지 컬렉터, 자동 저장, 화면 자동갱신 등에 사용

 

- 무한루프와 조건문을 이용해서 실행 후 대기하다가 특정조건이 만족되면 작업을 수행하고 다시 대기하도록 작성함

 

 

 

 

 

 쓰레드의 상태 

 

 

 

 

 쓰레드의 실행제어 

- 쓰레드의 실행을 제어할 수 있는 메서드 제공

- 이들을 활용해서 보다 효율적인 프로그램을 작성할 수 있음