(JAVA) 프로세스와 쓰레드 개념 이해하기

2024. 9. 24. 21:12·JAVA

1. 프로세스란?

  • 프로세스는 실행 중인 프로그램으로, 각 프로세스는 독립된 메모리 공간을 할당받아 실행됩니다. 운영체제는 여러 프로세스를 동시에 처리하며 각 프로세스는 독립적으로 동작합니다.

2. 쓰레드란?

  • 쓰레드는 프로세스 내에서 실행되는 독립적인 작업 단위입니다. 여러 쓰레드가 하나의 프로세스 내 자원을 공유하면서 동시에 실행될 수 있습니다. 멀티쓰레딩을 통해 하나의 프로세스 내에서 여러 작업을 병렬로 처리하여 성능을 향상시킬 수 있습니다.

3. 쓰레드의 종류

  • User Thread(사용자 쓰레드) : 일반적인 애플리케이션이 사용하는 쓰레드로, 주로 개발자가 명시적으로 생성하여 사용합니다.
  • Daemon Thread(데몬 쓰레드) : 백그라운드에서 실행되는 쓰레드로, 사용자 쓰레드가 모두 종료되면 자동으로 종료됩니다. 예: JVM의 가비지 컬렉터.

4. 쓰레드 생성 방법

  • Thread 클래스 상속 : Thread 클래스를 상속받아 run() 메서드를 오버라이딩하여 쓰레드를 정의할 수 있습니다. 이를 통해 쓰레드를 직접 관리할 수 있습니다.
  • Runnable 인터페이스 구현 : Runnable 인터페이스를 구현하여 쓰레드를 생성하는 방법은 객체지향적 접근을 지원합니다. 쓰레드를 객체로 분리하여 재사용성과 유지보수성을 높일 수 있습니다.

예시

class MyThread extends Thread {
    public void run() {
        System.out.println("Thread is running");
    }
}

class MyRunnable implements Runnable {
    public void run() {
        System.out.println("Runnable is running");
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread t1 = new MyThread();
        t1.start();  // Thread 클래스 직접 상속
       
        Thread t2 = new Thread(new MyRunnable());
        t2.start();  // Runnable 인터페이스 구현
    }
}

5. 멀티쓰레딩과 동기화

  • 멀티쓰레딩을 사용하면 하나의 프로세스 내에서 여러 작업을 동시에 처리할 수 있습니다. 예를 들어, GUI 프로그램에서 사용자 입력을 처리하는 동시에 백그라운드에서 데이터를 계산할 수 있습니다.
  • 여러 쓰레드가 공유 자원에 접근할 때는 동기화를 사용해 데이터 불일치를 방지합니다. synchronized 키워드를 사용하여 공유 자원에 대한 접근을 제어할 수 있습니다.

예시

class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }

    public int getCount() {
        return count;
    }
}

public class Main {
    public static void main(String[] args) {
        Counter counter = new Counter();

        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                counter.increment();
            }
        });

        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                counter.increment();
            }
        });

        t1.start();
        t2.start();

        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Final count: " + counter.getCount());
    }
}

6. TIP

  • ExecutorService를 사용하면 쓰레드를 직접 생성하지 않고도 쓰레드 풀을 통해 효율적으로 쓰레드를 관리할 수 있습니다. 예를 들어, 작업이 완료될 때까지 대기하거나, 일정 개수 이상의 쓰레드를 생성하지 않도록 조정할 수 있습니다.

예시

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Main {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(2);
        
        Runnable task1 = () -> System.out.println("Task 1 is running");
        Runnable task2 = () -> System.out.println("Task 2 is running");

        executor.submit(task1);
        executor.submit(task2);

        executor.shutdown();
    }
}

7. 정리

  • 자바에서 멀티쓰레딩을 제대로 활용하면 프로그램의 성능을 크게 향상시킬 수 있습니다. 다만, 동기화 처리와 쓰레드 관리에 신경 써야 합니다. ExecutorService와 같은 고급 도구들을 사용해 쓰레드 관리를 단순화하면 더 나은 성능과 유지보수성을 얻을 수 있습니다.
저작자표시 비영리 변경금지 (새창열림)

'JAVA' 카테고리의 다른 글

(JAVA) Wrapper 기본 개념 이해하기  (0) 2024.09.23
(JAVA) Generics 개념 이해하기  (0) 2024.09.20
(JAVA) 예외처리 알아가기  (0) 2024.09.20
(JAVA) 다중상속과 인터페이스 알아보기  (0) 2024.09.20
(JAVA) 추상클래스의 개념 + instanceof 이해하기  (0) 2024.09.20
'JAVA' 카테고리의 다른 글
  • (JAVA) Wrapper 기본 개념 이해하기
  • (JAVA) Generics 개념 이해하기
  • (JAVA) 예외처리 알아가기
  • (JAVA) 다중상속과 인터페이스 알아보기
lastdove
lastdove
lastdove 님의 블로그 입니다.
  • lastdove
    lastdove 님의 블로그
    lastdove
  • 전체
    오늘
    어제
    • 분류 전체보기 (80)
      • Spring (16)
      • JAVA (17)
      • JAVA 알고리즘 (20)
      • Project (5)
      • SQL 문제풀이 (17)
      • Git&Linux (2)
      • Web development(입문) (2)
      • Sparta (1)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
lastdove
(JAVA) 프로세스와 쓰레드 개념 이해하기

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.