컴퓨터 & 코딩/Java

[혼공학습단 10기][혼공자] 멀티 스레드

구로그 2023. 7. 17. 14:14
728x90

⬇️ 프로세스와 스레드에 대해 알아보기 ⬇️

 

[혼공학습단 10기][혼공컴운] 프로세스와 스레드

✓ 프로세스 개요 ✏️ 프로세스: 보조기억장치에 저장되어있는 프로그램을 메모리에 적재하고 실행하는 과정 포그라운드 프로세스: 사용자가 보는 앞에서 실행되는 프로세스 백그라운드 프로

hianzhi.tistory.com


✏️ 멀티 프로세스: 각 프로세스는 서로 독립적. 하나의 프로세스에서 오류가 발생해도 다른 프로세스에 영향을 미치지 않는다
✏️ 멀티 스레드: 하나의 프로세스 내부에 생성. 하나의 스레드가 예외를 발생시키면 프로세스 자체가 종료될 수 있어 예외 처리가 중요하다.

 

 

 

자바의 모든 어플리케이션은 메인 스레드가 main()메소드를 실행하면서 시작한다. 

이때 메인 스레드는 멀티 스레드를 생성해서 멀티 태스킹을 수행한다. 

 

 

✓ 스레드 생성 

자바에서는 작업 스레드도 객체로 생성된다.

 

1️⃣ java.lang.Thread 클래스를 직접 객체화 해서 생성하는 방법

Thread thread = new Thread(Runnable target);

 

Runnable은 인터페이스 타입이라 구현 객체를 만들어 대입해야 한다. 

구현 클래스는 run()을 재정의해서 작업 스레드가 실행할 코드를 작성해야 한다. 

// Runnable의 구현 객체
class Task implements Runnable {
    public void run() {
        // 스레드가 실행할 코드;
    }
}
// 작업 스레드 생성
Runnable task = new Task();
Thread thread = new Thread(task);

// 익명 구현 객체 사용 
Thread thread = new Thread(new Runnable() {
    public void run() {
        // 스레드가 실행할 코드;
    }
}

코드를 절약하기 위해 Runnable 익명 객체를 매개값으로 사용하는 편이다. 

이후 start()메소드를 호출하면 작업 스레드가 실행된다. (+ 바로 실행되는 것이 아니라 실행 대기 상태가 된다) 

thread.start();

 

 

 

2️⃣ Thread 클래스를 상속해서 하위 클래스를 만들어 생성 

public class WorkerThread extedns Thread {
    @Override
    public void run() {
        // 스레드가 실행할 코드;
    }
}
Thread thread = new WorkerThread();


// 익명 객체로 생성하기
Thread thread = new Thread() {
    public void run() {
        // 스레드가 실행할 코드;
    }
}

 

+ 스레드 이름: 디버깅 할 때 어떤 스레드가 어떤 작업을 하는지 조사할 목적으로 사용됨 

디폴트 이름은 Thread-n 이다. 다른 이름으로 설정하고 싶다면 setName() 메소드로 변경하면 된다.

스레드의 이름을 알고 싶다면 getName() 메소드를 호출하면 됨.

thread.setName("스레드 이름");
thread.getName();

 

두 메소드 다 Thread 클래스의 인스턴스 메소드이기 때문에 스레드 객체의 참조가 필요하다.

만약 참조를 가지고 있지 않다면 정적 메소드인 currentThread()를 이용할 수 있다.

Thread thread = Thread.currentThread();

 


✓ 동기화 메소드 

❗️스레드들이 객체를 공유해서 작업하는 경우, 스레드 A가 사용하던 객체를 스레드 B가 상태를 변경할 수 있다.

 

스레드가 사용 중인 객체를 다른 스레드가 변경할 수 없게 하려면 스레드 작업이 끝날 때까지 객체에 잠금을 걸어서 다른 스레드가 사용할 수 없도록 해야 한다. 임계 영역을 지정하여 객체를 잠글 수 있는데 이를 위해 동기화 메소드를 사용한다. 

 

✏️ 임계영역 critical section: 멀티 스레드 프로그램 내 단 하나의 스레드만 실행할 수 있는 코드 영역
public synchronized void method() {
    // 임계 영역
}

스레드가 동기화 메소드를 실행하는 즉시 객체에는 잠금이 일어나고 스레드가 동기화 메소드를 실행 종료하면 잠금이 풀린다. 

 

 

 

 

반응형