Thread (1)

Drumj·2023년 2월 21일
0

오늘의 학습

오늘은 자바의 정석 13챕터 Thread를 공부했다.


프로세스와 스레드

프로세스(Process) : 실행 중인 프로그램(Program)
프로그램을 실행하면 OS로부터 실행에 필요한 자원(메모리)를 할당받아 프로세스가 된다고 한다.

프로세스는 데이터와 메모리 등의 자원, Thread로 구성되어 있으며
실제로 작업을 수행하는 것이 Thread라고 한다.

모든 프로세스에는 최소한 하나 이상의 쓰레드가 존재
둘 이상의 쓰레드를 가진 프로세스를 멀티쓰레드 프로세스 라고 한다.


장단점

  • 장점 :
    - CPU의 사용률을 향상시킨다.
    - 자원을 보다 효율적으로 사용할 수 있다.
    - 사용자에 대한 응답성이 향상된다.
    - 작업이 분리되어 코드가 간결해진다.

  • 단점 :
    - 동기화(Synchronization)
    - 데드락(DeadLock)


구현과 실행

쓰레드를 구현하는 2가지 방법

Thread 클래스를 상속 받는 방법
Runnable 인터페이스를 구현하는 방법

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

//2. Runnable Interface Implements
class MyThread implements Runnable {
	public void run() {/* 작업내용 */} //Runnable 인터페이스의 run()을 구현
}

두 방법 중 어느 것을 선택하든지 쓰레드를 통해 작업하고자 하는 내용으로run()의 몸통{}을 채우는 것

또 쓰레드를 생성했다고 자동으로 실행되지는 않는다.
.start()를 호출해야만 쓰레드가 실행된다.


싱글쓰레드와 멀티쓰레드

두 개의 작업을 하나의 쓰레드로 처리하는 경우와
두개의 쓰레드로 처리하는 경우를 가정해보자.

위 그림에서 알 수 있듯이 두 작업 모두 수행 시간은 거의 같다. 오히려 두개의 쓰레드로 작업한 시간이 조금 더 오래 걸렸는데 그 이유는 쓰레드 간의 작업 전환(Context Switching)에 시간이 걸리기 때문이다.

또 다른 이유로는 한 쓰레드가 화면에 출력하고 있는 동안 다른 쓰레드는 출력이 끝나기를 기다려야하는데 이때 발생하는 대기시간 때문에 작업 시간이 길어진다.


쓰레드의 우선순위

쓰레드는 우선순위(priority)라는 속성(멤버변수)를 가지고 있다.
이 우선순위의 값에 따라 쓰레드가 얻는 실행시간이 달라진다.

void setPriority(int newPriority) // 쓰레드의 우선순위를 지정한 값으로 변경
int getPriority() //쓰레드의 우선순위를 반환한다.

public static final int MAX_PRIORITY = 10 // 최대우선순위
public static final int MIN_PRIORITY = 1  // 최소우선순위
public static final int NORM_PRIORITY = 5 // 보통우선순위

우선순위의 범위는 1~10 이며 숫자가 높을수록 우선순위가 높다.

쓰레드의 우선순위는 쓰레드를 생성한 쓰레드로부터 상속받는다

ex) main메서드를 수행하는 쓰레드는 우선순위가 5, main메서드 내에서 생성하는 쓰레드의 우선순위는 자동적으로 5가 된다.

또, 멀티코어에서는 쓰레드의 우선순위에 따른 차이가 거의 없다고 한다.


쓰레드 그룹

서로 관련된 쓰레드를 그룹으로 다루기 위한 것.
보안상의 이유로 도입된 개념으로, 자신이 속한 쓰레드 그룹이나 하위 쓰레드 그룹은 변경할 수 있지만 다른 쓰레드 그룹의 쓰레드를 변경할 수는 없다.

Thread(ThreadGroup group, String name)
Thread(ThreadGroup group, Runnable target)
Thread(ThreadGroup group, Runnable target, String name)
Thread(ThreadGroup group, Runnable target, String name, long stackSize)

모든 쓰레드는 반드시 그룹에 포함되어 있어야 한다.
위에서 쓰레드 그룹을 지정하지 않고 생성하면 기본적으로 자신을 생성한 쓰레드와 같은 쓰레드 그룹에 속하게 된다.

그룹과 관련된 메서드

ThreadGroup getThreadGroup() //쓰레드 자신이 속한 쓰레드 그룹을 반환
void uncaughtException(Thread t, Throwable e)
//처리되지 않은 예외에 의해 쓰레드 그룹의 쓰레드가 실행이 종료 되었을때,
//JVM에 의해 이 메서드가 자동적으로 호출된다.

여기까지, 13챕터 쓰레드 부분. 13-1 ~ 13-17

0개의 댓글