개발 무지렁이

[Java] 하나의 프로세스 안의 멀티스레드(메인스레드 + 多 작업스레드)의 구현 본문

Backend/자바

[Java] 하나의 프로세스 안의 멀티스레드(메인스레드 + 多 작업스레드)의 구현

Gaejirang-e 2023. 8. 12. 16:21

𐂂 운영체제(os)는 실행중인 프로그램을 프로세스로 관리한다.
운영체제는 멀티프로세스를 생성해서 처리하지만,
하나의 프로세스 내에서 멀티태스킹을 할 수도 있다.
하나의 프로세스가 두가지 이상의 작업을 처리할 수 있는 이유는 멀티스레드가 있기 때문이다.

𐁍 '스레드' 란
코드의 실행흐름을 말한다.
멀티스레드는 하나의 프로세스 내부에서 생성되기 때문에
하나의 스레드가 예외를 발생시키면, 프로세스가 종료되므로
다른 스레드에 영향을 미친다.

⚠️ 멀티스레드를 사용하는 경우 예외처리에 신경써야한다.
⚠️ 멀티스레드에서는 실행 중인 스레드가 하나라도 있다면, 프로세스는 종료되지 않는다.

🦔 모든 자바 프로그램은 메인스레드가 main메서드를 실행하면서 시작된다.
멀티스레드로 실행하는 프로그램을 개발하려면
먼저, 몇개의 작업병렬로 실행할지 결정하고,
각자 작업별로 스레드를 생성해한다.

𖠃 작업스레드도 객체로 관리된다.
🪡 Thread클래스로 직접생성 (java.lang)
=> Runnable 구현객체매개변수로 가지는 Thread 생성자를 호출한다.
  (Runnable스레드가 작업을 실행할 때 사용하는 인터페이스를 말한다.)
=> Runnable 인터페이스에 정의된 run()메서드를 오버라이딩하여, 스레드가 실행할 코드를 넣는다.
  class Task implements Runnable {
      @Override
      public void run() {
        //스레드가 실행할 코드
      }
  }

  Runnable task = new Task();
  Thread thread = new Thread(task);

  thread.start();// run()메서드 실행 -> 작업처리(작업스레드 실행)
🤡 사실 Thread 클래스 안에도 run() 메서드가 정의되어 있다.
하지만 굳이 Runnable 인터페이스를 구현한 객체를 스레드 생성자의 매개변수로 전달해서 사용하는 이유는
스레드 작업스레드 자체역할을 분리하여 더 구조적으로 관리할 수 있기 때문이다.

𖠃 Runnable 익명 구현 객체를 매개변수로 사용하기 (권장, 간편해서)
  Thread thread = new Thread(new Runnable() {
      @Override
      public void run() {
          //스레드가 실행할 코드
      }
  });

  thread.start();

📜 PrintingABExample.java

  public class PrintABExample {
      public static void main(String[] args) {
          Thread thread = new Thread(new Runnable() {
              @Override
              public void run() {
                  for(int i = 0; i < 3; i++) {
                      System.out.println("B");
                      try {
                          Thread.sleep(500);
                      } catch (Exception e) { }
                  }
              }
          });

          //작업스레드 - Printing "B"
          thread.start();

          //메인스레드 - Printing "A"
          for(int i = 0; i < 3; i++) {
              System.out.println("A");
              try {
                  Thread.sleep(500);
              } catch (Exception e) { }
          }
      }
  }
  // A
  // B
  // B
  // A
  // B
  // A
Comments