Backend/Java

Java - 스레드 (Thread)

퐁고 2023. 2. 23. 19:57
반응형

스레드란? (thread)

스레드는 프로그램에서 실행되는 흐름의 단위, 쓰레드를 사용하면 동시에 여러 가지 작업을 처리할 수 있다.

스레드 생성하기

// Thread 클래스를 상속받아 쓰레드 생성하기
public class MyThread extends Thread {
    public void run() {
        // 쓰레드가 실행할 코드 작성
    }
}

// Runnable 인터페이스를 구현하여 쓰레드 생성하기
public class MyRunnable implements Runnable {
    public void run() {
        // 쓰레드가 실행할 코드 작성
    }
}

// 쓰레드 생성하기
MyThread myThread = new MyThread();
Thread myRunnableThread = new Thread(new MyRunnable());

스레드 실행하기

  • 스레드를 생성하고 나면 start() 메소드를 호출하여 실행할 수 있다.
myThread.start();
myRunnableThread.start();

스레드 상태

  • 스레드는 실행 중일 때, 대기 중일 때, 일시 정지 상태일 때 등 여러 가지 상태를 가질 수 있다. Java에서는 스레드 상태를 나타내는 Thread.State 열거형을 제공
Thread.State state = myThread.getState();
System.out.println(state); // 출력 예시: RUNNABLE

  • 일시정지로 보냄
    • sleep(시간) - 주어진 시간이 지나면 자동적으로 실행 대기 상태가 된다.
    • join() - 일시정지
    • wait() - 동기화 블록 내에서 일시 정지
  • 일시 정지에서 벗어남
    • interrupt() - InterruptedException을 발생시켜 실행 대기 상태 혹은 종료 상태 만든다.
    • notify() - wait() 메소드로 인해 일시 정지 상태인 스레드를 실행 대기로 보낸다.
    • notifyAll()
  • 실행 대기로 보냄
    • yield() - 실행 상태에서 다른 스레드에게 실행을 양보하고 실행 대기 상태가 된다.

스레드 동기화

  • 여러 개의 쓰레드가 공유된 자원에 접근할 때, 동기화 문제가 발생, 이 때는 synchronized 키워드를 사용하여 동기화를 할 수 있다.
  • 인스턴스와 정적 메소드 어디든 붙일 수 있다.
public synchronized void increment() {
    count++; // 공유 변수 count 증가
		// 
}

스레드 예외 처리

  • 스레드에서 예외가 발생하면 쓰레드가 종료, 이 때는 try-catch 문을 사용하여 예외를 처리할 수 있다.
public void run() {
    try {
        // 쓰레드가 실행할 코드 작성
    } catch (Exception e) {
        e.printStackTrace();
    }
}

위와 같이 예외를 처리하면 스레드가 종료되지 않고 계속 실행됩니다.

결론

Java에서는 스레드를 사용하여 프로그램을 동시에 여러 가지 작업을 처리할 수 있다. 그러나 스레드를 사용할 때는 동기화 문제와 예외 처리에 주의해야 한다.