Java에서 멀티스레딩 기본 개념 및 활용
Java에서 멀티스레딩은 여러 개의 스레드를 동시에 실행하여 애플리케이션의 성능을 향상시키고, 사용자 경험을 개선하는 기술입니다. 이 글에서는 Java에서 멀티스레딩의 기본 개념과 활용 방법을 소개합니다.
1. 스레드란?
스레드는 프로세스 내에서 실행되는 작은 단위의 실행 흐름입니다. 각 스레드는 독립적인 실행 경로와 자원을 가집니다. 멀티스레딩을 사용하면 한 프로세스 내에서 여러 개의 스레드가 동시에 실행되어, 자원을 공유하며 작업을 처리할 수 있습니다.
2. Java에서 스레드 생성 및 실행
Java에서 스레드를 생성하고 실행하는 방법은 크게 두 가지입니다.
- Thread 클래스를 상속받아서 새로운 클래스를 정의하고, run() 메소드를 오버라이드합니다.
- Runnable 인터페이스를 구현하는 클래스를 정의하고, run() 메소드를 구현합니다.
두 방법 중 하나를 선택한 후, Thread 객체를 생성하고 start() 메소드를 호출하여 스레드를 실행시킬 수 있습니다.
2.1. Thread 클래스 상속
class MyThread extends Thread {
@Override
public void run() {
// 스레드가 실행할 작업
}
}
public class Main {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start(); // 스레드 실행
}
}
2.2. Runnable 인터페이스 구현
class MyRunnable implements Runnable {
@Override
public void run() {
// 스레드가 실행할 작업
}
}
public class Main {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start(); // 스레드 실행
}
}
3. 스레드 동기화와 공유 자원 관리
멀티스레딩 환경에서 여러 스레드가 공유 자원에 동시에 접근하면 데이터 무결성이 깨질 수 있습니다. 이를 방지하기 위해 Java에서는 synchronized 키워드를 사용하여 스레드 동기화를 구현할 수 있습니다.
public class SharedResource {
private int counter;
public synchronized void increment() {
counter++;
}
public synchronized void decrement() {
counter--;
}
public synchronized int getCounter() {
return counter;
}
}
public class IncrementThread implements Runnable {
private SharedResource sharedResource;
public IncrementThread(SharedResource sharedResource) {
this.sharedResource = sharedResource;
}
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
sharedResource.increment();
}
}
}
public class DecrementThread implements Runnable {
private SharedResource sharedResource;
public DecrementThread(SharedResource sharedResource) {
this.sharedResource = sharedResource;
}
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
sharedResource.decrement();
}
}
}
public class Main {
public static void main(String[] args) throws InterruptedException {
SharedResource sharedResource = new SharedResource();
Thread incrementThread = new Thread(new IncrementThread(sharedResource));
Thread decrementThread = new Thread(new DecrementThread(sharedResource));
incrementThread.start();
decrementThread.start();
incrementThread.join();
decrementThread.join();
System.out.println("Counter: " + sharedResource.getCounter());
}
}
위 예제에서는 SharedResource
클래스의 메소드에 synchronized
키워드를 사용하여 동기화를 구현했습니다. 이렇게 하면 한 번에 하나의 스레드만 해당 메소드를 실행할 수 있으며, 다른 스레드는 대기하게 됩니다.
4. Executor Framework 활용
Java에서는 스레드를 직접 관리하는 대신 Executor Framework를 활용하여 스레드 풀(thread pool)을 사용할 수 있습니다. 이를 통해 스레드 생명주기 관리와 스레드 재사용을 쉽게 할 수 있습니다.
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(10);
for (int i = 0; i < 100; i++) {
executorService.submit(() -> {
// 스레드가 실행할 작업
});
}
executorService.shutdown();
}
}
위 예제에서는 Executors.newFixedThreadPool() 메소드를 사용하여 고정 크기의 스레드 풀을 생성했습니다. submit() 메소드를 사용하여 작업을 제출하면, 스레드 풀에서 사용 가능한 스레드가 작업을 실행합니다.
이상으로 Java에서 멀티스레딩의 기본 개념과 활용 방법에 대해 알아보았습니다. 멀티스레딩을 활용하면 애플리케이션의 성능을 향상시키고, 사용자 경험을 개선할 수 있습니다. 하지만 스레드 동기화와 공유 자원 관리에 주의해야 합니다.
'자기개발 > 검색한 자료 정리' 카테고리의 다른 글
Java에서 JUnit과 Mockito를 활용한 단위 테스트 작성 방법 (0) | 2023.04.21 |
---|---|
React와 TypeScript를 활용한 현대 웹 애플리케이션 개발 (0) | 2023.04.21 |
Java 11의 새로운 문자열 메소드와 편리한 기능 소개 (0) | 2023.04.21 |
CSS로 효과적인 애니메이션 만들기: transition과 keyframes (0) | 2023.04.21 |
Java와 JavaScript에서 비동기 작업 처리 방식 비교 (0) | 2023.04.21 |