교육 (Today I Learned)/SeSAC

SeSAC 25일차 / 스레드

Bay Im 2023. 8. 25. 00:39
SeSAC 25일차(2023-08-25)
스레드


스레드

자바에서 스레드는 프로세스 내에서 실행되는 하위 작업 단위. 스레드를 사용하면 동시에 여러 작업을 수행할 수 있으므로 시스템 성능을 향상시킬 수 있다.

스레드 만드는 방법은 Runnable 인터페이스를 구현하거나 Thread 클래스를 상속하여 스레드를 만든다. 이후 start() 메서드를 호출하여 스레드를 시작한다.

 

Thread 클래스

  • Thread 클래스를 상속받아 새로운 스레드를 만들 수 있으며, run() 메서드를 오버라이딩하여 스레드가 실행할 코드를 작성
  • 예시 코드
public class MyThread extends Thread {
    public void run() {
        // 스레드가 실행할 코드 작성
        System.out.println("Hello, World!");
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();
    }
}

위 코드에서 MyThread 클래스는 Thread 클래스를 상속받아 새로운 스레드를 만든다.

run() 메서드를 오버라이딩하여 스레드가 실행할 코드를 작성.

스레드가 실행되면 run() 메서드가 실행되며, "Hello, World!"가 출력.

 

 

  • Runnable 인터페이스
    • Runnable 인터페이스를 구현하고 run() 메서드를 오버라이딩하여 새로운 스레드를 생성. 생성된 스레드는 Thread 클래스의 생성자에 Runnable 객체를 전달하여 실행할 수 있다.
    • 예시 코드
    public class MyRunnable implements Runnable {
        @Override
        public void run() {
            for (int i = 1; i <= 5; i++) {
                System.out.println("Runnable 스레드: " + i);
                try {
                    Thread.sleep(1000); // 1초 동안 일시 정지
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
        public static void main(String[] args) {
            MyRunnable myRunnable = new MyRunnable();
            Thread thread = new Thread(myRunnable); // Runnable을 이용해 스레드 생성
            thread.start(); // 스레드 시작
    
            for (int i = 1; i <= 5; i++) {
                System.out.println("메인 스레드: " + i);
                try {
                    Thread.sleep(500); // 0.5초 동안 일시 정지
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    이 코드에서는 MyRunnable 클래스가 Runnable 인터페이스를 구현하고, run() 메서드 안에는 스레드가 실행할 내용을 작성.메인 스레드와 Runnable 스레드는 병행적으로 실행되며, 각각 1초와 0.5초마다 메시지를 출력하고 잠시 일시 정지.결과적으로 이 코드는 메인 스레드와 Runnable 스레드가 번갈아가며 실행되면서 출력 결과가 나타나게 된다.메인 메서드에서는 MyRunnable 인스턴스를 생성하고 이를 Thread 생성자의 인자로 전달하여 새로운 스레드를 생성하고 시작.

 

 

스레드 관련 함수

  • start() 메서드
    • start() 메서드는 새로운 스레드를 시작하는 메서드입니다. start() 메서드를 호출하면 새로운 스레드가 생성되고, run() 메서드가 실행됩니다. start() 메서드는 새로운 스레드를 생성하는 것이므로, 반드시 한 번만 호출해야 합니다.
  • join() 메서드
    • join() 메서드는 다른 스레드가 종료될 때까지 현재 스레드를 대기시키는 메서드입니다. join() 메서드를 호출한 스레드는 다른 스레드가 종료될 때까지 실행되지 않습니다. join() 메서드는 InterruptedException을 발생시킬 수 있습니다.
  • sleep() 메서드
    • sleep() 메서드는 현재 스레드를 지정된 시간만큼 멈추는 메서드입니다. sleep() 메서드는 InterruptedException을 발생시킬 수 있습니다.
  • interrupt() 메서드
    • interrupt() 메서드는 스레드를 인터럽트하는 메서드입니다. 스레드가 블록킹 상태에서 interrupt() 메서드가 호출되면, 스레드는 InterruptedException을 발생시키고 블록킹 상태를 해제합니다.
  • isInterrupted() 메서드
    • isInterrupted() 메서드는 스레드가 인터럽트되었는지 여부를 확인하는 메서드입니다.
  • setPriority() 메서드
    • setPriority() 메서드는 스레드의 우선순위를 설정하는 메서드입니다. 우선순위는 1부터 10까지의 값을 가지며, 높은 우선순위를 가진 스레드가 먼저 실행될 가능성이 높습니다.
  • yield() 메서드
    • yield() 메서드는 현재 실행 중인 스레드를 일시 정지시키고, 다른 스레드에게 실행 기회를 양보하는 메서드입니다. 호출되었을 때, 현재 스레드는 실행 대기 상태로 돌아가고, 다른 스레드가 실행될 수 있습니다. 그러나, 다른 스레드가 없거나 다른 스레드가 대기 중인 상태라면, 현재 스레드가 다시 실행될 수도 있습니다. yield() 메서드는 InterruptedException을 발생시킬 수 있습니다.

 

 

  • 오늘의 실습 코드

https://github.com/yubin-im/SeSAC/tree/be725ed88d0b101bfc08348cca8df1cfd40baf77/20230821/Thread

728x90