[자바의 신] 25장 쓰레드는 개발자라면 알아두는 것이 좋아요

한지연·2023년 4월 21일
0

📘 스레드

  • 하나의 프로세스 내에서 실제로 작업을 수행하는 단위
  • 멀티쓰레드: 하나의 프로세스 내에서 둘 이상의 쓰레드가 동시 작업
  • ❗️여러 프로세스가 하나의 스레드를 공유하는 것을 불가능
  • 메모리 점유를 적게 함
  • 스레드의 실행 순서는 순차적이지 않음

📚 스레드를 생성하는 방법

1️⃣ Runnable Interface

  • Runnable 인터페이스에 선언된 메소드는 void run() 하나 뿐임
  • 스레드 클래스가 다른 클래스를 확장할 필요가 있을 경우 사용
  • Runnable을 구현한 클래스는 바로 쓰레드로 시작할 수 없기 때문에 Thread 객체를 추가하여 시작해주어야 함
// Runnable을 구현한 클래스 작성
public class MakeRunnable implements Runnable{
    @Override
    public void run() {

        System.out.println("Runnable 인터페이스를 구현한 클래스: MakeRunnable");
    }
}
// Thread 클래스의 생성자에 객체를 추가하여 시작해주기
    public static void main(String[] args) {

        MakeRunnable runnable = new MakeRunnable();
        MakeRunnable runnable2 = new MakeRunnable();

        new Thread(runnable).start();
        new Thread(runnable2).start();

    }

2️⃣ Thread Class

  • 모든 스레드는 이름을 가짐 (기본: Thread-n)
  • 스레드 클래스가 다른 클래스를 확장할 필요가 없는 경우 사용
public class MakeThread extends Thread{
    public MakeThread(String name) {
        super("CustomThread");
    }

    @Override
    public void run() {
        System.out.println("Thread Class를 확장하여 실행함");
    }
}

sleep() 메소드


    @Override
    public void run() {
        
        while(true){
            
            try{
                System.out.println(System.currentTimeMillis());
                Thread.sleep(1000);
                
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
  • 호출 후 매개변수로 지정한 시간만큼 멈춤

setPriority(int newPriority)

  • 스레드의 우선 순위를 지정함
  • 하지만 기본값 사용하는 것을 권장

❗️ Daemon Thread

public class DaemonThread extends Thread{
    public void runDaemonThread(){
        DaemonThread daemonThread = new DaemonThread();
        daemonThread.setDaemon(true);
        daemonThread.start();
    }
    
    @Override
    public void run() {
        try{
            Thread.sleep(Integer.MAX_VALUE);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
  • 해당 스레드가 종료되지 않아도 실행중인 다른 일반 스레드가 없으면 멈춤
  • 부가적인 작업을 수행하는 스레드를 선언할 때 사용

📚 Synchronized

  • 자바의 예약어 중 하나
  • 여러 스레드가 한 자원에 접근하여 문제가 생기는 것을 방지

1️⃣ 메소드 자체를 Synchronized로 선언

    public synchronized int multiplyValue(int num){
        return num * num;
    }
  • 동일한 객체에 여러 스레드가 접근해도 한 순간에 하나만 점유할 수 있도록 함
  • 다른 스레드는 이전 스레드가 종료될 때까지 기다림
  • 간단히 사용할 수 있지만 필요없는 대기시간을 만들어 성능 문제 발생 가능성이 있음

2️⃣ 변수를 처리하는 부분만 Synchronized 처리

    public int multiplyValue2(int num){ 
        synchronized (this){
            num = num *2;
        }
        return num;
    }
  • 객체(lock)를 사용하여 블록 내의 문장을 하나의 스레드만 수행할 수 있도록 함

📚 스레드를 통제하는 메소드들

1️⃣ getState()

  • 스레드의 상태 확인

2️⃣ join()

  • 수행중인 스레드가 중지할 때까지 대기
  • 매개변수가 없다면 스레드가 종료될 때까지 무한 대기

3️⃣ interrupt()

  • InterruptedException을 발생시키며 수행중인 스레드 중단
  • 스레드 시작 전이나 종료 후 호출하면 예외없이 다음 문장으로 넘어감

📚 ThreadGroup

  • 스레드의 관리를 용이하게 하기 위한 클래스
  • 트리구조를 가짐

주요메소드

int			activeCount()
int			activeGroupCount()
void		checkAccess()
void		destroy()
int			enumerate(Thread[] list)
int			enumerate(Thread[] list, boolean recurse)
int			enumerate(ThreadGroup[] list)
int			enumerate(ThreadGroup[] list, boolean recurse)
int			getMaxPriority()
String		getName()
ThreadGroup	getParent()
void		interrupt()
boolean		isDaemon()
boolean		isDestroyed()
void		list()
boolean		parentOf(ThreadGroup g)
void		setDaemon(boolean daemon)
void		setMaxPriority(int pri)
String		toString()
void		uncaughtException(Thread t, Throwable e)
profile
배우고 활용하는 것을 즐기는 개발자, 한지연입니다!

0개의 댓글