[이것이 자바다] 14장 정리

자바에서 멀티 스레드와 스레드풀의 개념과 사용법을 다룹니다. 멀티 스레드는 하나의 프로세스 내에서 여러 작업을 동시에 처리할 수 있게 해주며, 스레드 생성에는 Runnable 구현 객체를 사용합니다. 스레드풀은 여러 스레드를 효율적으로 관리하며, ExecutorService 인터페이스와 Executors 클래스를 통해 생성하고 사용할 수 있습니다. 스레드풀의 스레드는 데몬 스레드가 아니므로, 작업을 완료하려면 shutDown() 또는 shutDownNow() 메소드를 실행해야 합니다.
Jan 22, 2024
[이것이 자바다] 14장 정리

CreateThreadExam.java

package ch14; import java.awt.Toolkit; public class CreateThreadExam { public static void main(String[] args) { Toolkit toolkit = Toolkit.getDefaultToolkit(); // Thread thread = new Thread() { // @Override // public void run() { // for (int i = 0; i < 5; i++) { // System.out.println("띵"); // try { // Thread.sleep(500); // } catch (Exception e) { // } // } // } // }; // thread.start(); Thread thread = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 5; i++) { System.out.println("띵"); try { Thread.sleep(500); } catch (Exception e) { } } } }); thread.start(); for (int i = 0; i < 5; i++) { toolkit.beep(); try { Thread.sleep(500); } catch (Exception e) { } } } }
 

핵심 키워드

  • 운영체제는 실행 중인 프로그램을 프로세스로 관리한다. 멀티 태스킹은 두 가지 이상의 작업을 동시에 처리하는 것을 말하는데, 이 때 운영체제는 멀티 프로세스를 생성해서 처리한다.
  • 하나의 프로세스 내에서 멀티 태스킹을 할 수 있도록 만들어진 프로그램도 있다. 하나의 프로세스가 두 가지 이상의 작업을 처리할 수 있는 이유는 멀티 스레드가 있기 때문이다.
  • 멀티 스레드로 실행하는 프로그램을 개발하려면 먼저 몇 개의 작업을 병렬로 실행할 지 결정하고 각 작업별로 스레드를 생성해야 한다.
  • java.lang 패키지에 있는 Thread 클래스로부터 작업 스레드 객체를 직접 생성하려면 다음과 같이 Runnable 구현 객체를 매개값으로 가지는 생성자를 호출한다.
    • Thread thread = new Thread(Runnable target);
  • 명시적인 Runnable 구현 클래스를 작성하지 않고 Thread 생성자를 호출할 때 Runnable 익명 구현 객체를 매개값으로 사용할 수 있다. 작업 스레드를 실행하려면 스레드 객체의 start() 메소드를 호출해야 한다.
    • Thread thread = new Thread( new Runnable() { @Override public void run(){ // 스레드가 실행할 코드 } } ); thread.start();
 

RunnableExam.java

package ch14; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class RunnableExam { public static void main(String[] args) { String[][] mails = new String[1000][3]; for (int i = 0; i < mails.length; i++) { mails[i][0] = "admin@my.com"; mails[i][1] = "member" + i + "@my.com"; mails[i][2] = "신상품 입고"; } ExecutorService ex = Executors.newFixedThreadPool(5); // 최대 스레드 개수, 한번 만들어진 스레드는 사라지지 않음 for (int i = 0; i < 1000; i++) { final int idx = i; ex.execute(new Runnable() { @Override public void run() { Thread th = Thread.currentThread(); String from = mails[idx][0]; String to = mails[idx][1]; String content = mails[idx][2]; System.out.println("[" + th.getName() + "] " + from + " ==> " + to + ": " + content); } }); } ex.shutdown(); //작업 끝낼때까지 기다린 후 종료 // ex.shutdownNow(); //작업 끝내지 못해도 강제로 종료 } }
 

핵심 키워드

  • 자바는 스레드풀을 생성하고 사용할 수 있도록 ExecutorService 인터페이스와 Executors 클래스를 제공한다.
  • 초기 수는 스레드풀이 생성될 때 기본적으로 생성되는 스레드 수를 말하고, 코어 수는 스레드가 증가된 후 사용되지 않는 스레드를 제거할 때 최소한 풀에서 유지하는 스레드 수를 말한다. 최대 수는 증가되는 스레드의 한도 수이다.
  • 스레드풀의 스레드는 데몬 스레드가 아니기 때문에 main 스레드가 종료되더라고 작업을 처리하기 위해 ㅐ계속 실행 상태로 남아있다. 따라서 스레드풀의 모든 스레드를 종료하려면 shutDown(), shutDownNow() 메소드를 실행해야 한다.
 

결론

해당 문제를 풀면서 멀티 스레드의 개념과 스레드풀의 실행 방식을 이해할 수 있었다.
Share article

More articles

See more posts

👨🏻‍💻DriedPollack's Blog