Notice
Recent Posts
Recent Comments
Link
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Tags
more
Archives
Today
Total
관리 메뉴

노승현

스레드 본문

JAVA/Mentor JAVA

스레드

nsh95 2024. 1. 25. 18:00

 

프로세스와 스레드는 컴퓨터 프로그램 실행과 관련된 중요한 컴퓨팅 개념입니다.

프로세스(Process):

  1. 정의:
    • 프로세스는 실행 중인 프로그램으로, 메모리에 올라가서 실행 중인 프로그램의 인스턴스입니다.
    • 각각의 프로세스는 독립적인 메모리 공간을 가지며, 서로 영향을 미치지 않습니다.
  2. 특징:
    • 프로세스는 각각 독립된 자원을 할당받아 실행되기 때문에 안정성이 높습니다.
    • 각 프로세스는 독립된 주소 공간을 가지므로, 한 프로세스의 오류가 다른 프로세스에 영향을 주지 않습니다.
    • 프로세스 간 통신은 별도의 메커니즘을 사용하여 이루어집니다.

스레드(Thread):

  1. 정의:
    • 스레드는 프로세스 내에서 실행되는 작은 실행 단위입니다.
    • 하나의 프로세스 내에서 여러 스레드가 공유된 자원(메모리)을 사용하며 동작합니다.
  2. 특징:
    • 스레드는 프로세스 내부의 자원을 공유하기 때문에, 스레드 간 통신은 프로세스 간 통신보다 간단합니다.
    • 여러 스레드가 동시에 실행될 수 있어 멀티태스킹을 지원하며, 이로 인해 성능 향상이 이루어질 수 있습니다.
    • 그러나 스레드 간 동기화와 관련된 문제에 주의해야 합니다.
  3. 자바에서의 스레드:
    • 자바는 멀티스레딩을 지원하며, Thread 클래스나 Runnable 인터페이스를 통해 스레드를 생성하고 관리할 수 있습니다.
    • 자바에서의 스레드는 JVM(Java Virtual Machine)에 의해 스케줄링되며 실행됩니다.

프로세스와 스레드는 모두 병행성(Concurrency)과 병렬성(Parallelism)의 개념과 관련이 있으며, 각각의 상황에 따라 선택되어야 합니다.

 

 

스레드를 사용하는 것은 여러 작업을 동시에 처리하고 프로그램의 성능을 향상시키기 위한 방법 중 하나입니다. 자바에서는 스레드를 구현하고 관리하기 위한 다양한 클래스와 메커니즘을 제공합니다.

1. 스레드 생성:

  • Thread 클래스 또는 Runnable 인터페이스 활용:
    • Thread 클래스를 상속하거나 Runnable 인터페이스를 구현하여 스레드를 생성할 수 있습니다.
    • run 메서드에 스레드가 실행할 코드를 작성합니다.
    • 새로운 스레드를 생성하고 시작하기 위해 start 메서드를 호출합니다.
// Thread 클래스 상속
class MyThread extends Thread {
    public void run() {
        // 스레드가 실행할 코드 작성
    }
}

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

// 스레드 생성 및 시작
MyThread myThread = new MyThread();
myThread.start();

Thread thread = new Thread(new MyRunnable());
thread.start();

 

2. 스레드 동기화:

  • 여러 스레드가 공유된 자원에 동시에 접근할 때, 데이터 일관성을 유지하기 위해 동기화가 필요합니다.
  • synchronized 키워드를 사용하여 메서드 또는 블록을 동기화할 수 있습니다.
class SharedResource {
    private int count = 0;

    // synchronized 메서드
    public synchronized void increment() {
        count++;
    }

    // synchronized 블록
    public void someMethod() {
        synchronized (this) {
            // 코드 블록
        }
    }
}

 

 

3. 스레드 상태 제어:

  • sleep, yield, join 등의 메서드를 사용하여 스레드의 상태를 제어할 수 있습니다.
try {
    // 일정 시간 동안 스레드 중지
    Thread.sleep(1000);

    // 다른 스레드에게 실행 양보
    Thread.yield();

    // 다른 스레드가 종료될 때까지 대기
    anotherThread.join();
} catch (InterruptedException e) {
    e.printStackTrace();
}

 

 

4. 스레드 풀 사용:

  • 스레드를 효율적으로 관리하기 위해 스레드 풀을 사용할 수 있습니다.
  • ExecutorService를 활용하여 스레드 풀을 생성하고 작업을 할당할 수 있습니다.
ExecutorService executor = Executors.newFixedThreadPool(5);
executor.submit(new MyRunnable());

 

 

5. 스레드 안전성 고려:

  • 여러 스레드가 동시에 접근할 때 발생하는 경쟁 조건 및 교착상태를 방지하기 위해 스레드 안전한 자료구조 및 알고리즘을 사용해야 합니다.

스레드를 사용할 때에는 안전성, 효율성, 그리고 가독성을 고려하여 코드를 작성하는 것이 중요합니다.

 

 

스레드 동기화는 여러 스레드가 공유된 자원에 동시에 접근할 때 데이터 일관성을 유지하고, 경쟁 조건 및 교착상태를 방지하기 위한 기술입니다. 자바에서는 synchronized 키워드를 사용하여 메서드 또는 블록을 동기화할 수 있습니다.

1. synchronized 메서드:

  • 메서드 전체를 동기화하는 방법입니다. 해당 메서드가 호출될 때는 다른 스레드들이 접근하지 못하도록 합니다.
class SharedResource {
    private int count = 0;

    // synchronized 메서드
    public synchronized void increment() {
        count++;
    }
}

 

2. synchronized 블록:

  • 특정 부분만을 동기화하는 방법입니다. 메서드 전체가 아닌 특정 블록만을 동기화할 수 있습니다.
class SharedResource {
    private int count = 0;
    private Object lock = new Object();

    public void increment() {
        synchronized (lock) {
            // 동기화가 필요한 코드 블록
            count++;
        }
    }
}

 

 

3. 인스턴스와 클래스 수준의 동기화:

  • 인스턴스 수준의 동기화는 객체 인스턴스에 대해 동기화를 수행합니다.
  • 클래스 수준의 동기화는 클래스에 대해 동기화를 수행하며, static synchronized 키워드를 사용합니다.
class SharedResource {
    private static int classCount = 0;
    private int instanceCount = 0;

    // 클래스 수준의 동기화
    public static synchronized void incrementClassCount() {
        classCount++;
    }

    // 인스턴스 수준의 동기화
    public synchronized void incrementInstanceCount() {
        instanceCount++;
    }
}

 

 

4. volatile 키워드:

  • volatile 키워드를 사용하면 변수의 값을 메인 메모리에 즉시 반영하고, 캐시에 저장하지 않습니다.
  • volatile 변수는 일부 상황에서 동기화 문제를 해결하는 데 도움이 될 수 있습니다.
class SharedResource {
    private volatile int count = 0;

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

 

5. Lock 인터페이스:

  • java.util.concurrent.locks.Lock 인터페이스를 사용하여 더 세밀한 동기화를 구현할 수 있습니다.
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

class SharedResource {
    private int count = 0;
    private Lock lock = new ReentrantLock();

    public void increment() {
        lock.lock();
        try {
            // 동기화가 필요한 코드 블록
            count++;
        } finally {
            lock.unlock();
        }
    }
}

 

 

스레드 동기화는 프로그램의 성능을 저하시킬 수 있으므로, 필요한 부분에만 동기화를 적용하고 최소한의 동기화를 유지하는 것이 중요합니다.

'JAVA > Mentor JAVA' 카테고리의 다른 글

자바 입출력과 스트림  (0) 2024.01.25
람다식  (0) 2024.01.22
컬렉션 프레임워크  (0) 2024.01.22
API 클래스  (0) 2024.01.19
예외처리  (0) 2024.01.19