반응형
 

쓰레드(Thread): 개념과 활용

쓰레드(Thread)는 프로그램 내에서 독립적으로 실행되는 작업 단위입니다. 자바는 멀티쓰레드 프로그래밍을 지원하여 애플리케이션의 성능과 효율성을 극대화할 수 있습니다. 이 글에서는 쓰레드의 개념, 자바에서 쓰레드를 다루는 방법, 그리고 다양한 활용 예시를 소개합니다.


쓰레드(Thread)란?

**쓰레드(Thread)**는 프로세스 내에서 실행되는 가벼운 작업 단위입니다. 하나의 프로세스는 여러 쓰레드를 가질 수 있으며, 각 쓰레드는 독립적으로 실행됩니다. 자바에서 쓰레드는 멀티태스킹을 구현하거나 병렬 처리를 수행할 때 유용합니다.

쓰레드의 특징:
  1. 독립 실행: 각 쓰레드는 별도로 실행되며, 다른 쓰레드와 자원을 공유할 수 있음.
  2. 병렬 처리: 여러 작업을 동시에 처리하여 효율성 향상.
  3. 자원 공유: 메모리와 같은 자원을 공유하므로 동기화가 필요.

자바에서 쓰레드 다루기

자바에서 쓰레드를 생성하고 실행하는 방법은 크게 두 가지가 있습니다:

  1. Thread 클래스 상속
  2. Runnable 인터페이스 구현
예제 1: Thread 클래스 상속
class MyThread extends Thread {
    @Override
    public void run() {
        for (int i = 1; i <= 5; i++) {
	        System.out.println(Thread.currentThread().getName() + " - Count: " + i);
        }
    }
}

public class ThreadExample1 {
    public static void main(String[] args) {
        MyThread thread1 = new MyThread();
        MyThread thread2 = new MyThread();

        thread1.start();
        thread2.start();
	}
}
출력 결과 (순서 불확정):
 
Thread-0 - Count: 1
Thread-1 - Count: 1
...
예제 2: Runnable 인터페이스 구현
class MyRunnable implements Runnable {
    @Override
    public void run() {
        for (int i = 1; i <= 5; i++) {
	        System.out.println(Thread.currentThread().getName() + " - Count: " + i);
        }
    }
}

public class ThreadExample2 {
    public static void main(String[] args) {
        Thread thread1 = new Thread(new MyRunnable());
        Thread thread2 = new Thread(new MyRunnable());

        thread1.start();
        thread2.start();
    }
}
출력 결과 (순서 불확정):
 
Thread-0 - Count: 1
Thread-1 - Count: 1
...

쓰레드 동기화

쓰레드가 공유 자원에 접근할 때는 동기화가 필요합니다. 자바는 synchronized 키워드를 제공하여 쓰레드 간의 자원 충돌을 방지합니다.

예제 3: 동기화
class SharedResource {
    public synchronized void printNumbers(String threadName) {
        for (int i = 1; i <= 5; i++) {
	        System.out.println(threadName + " - Number: " + i);
            try {
	            Thread.sleep(100); // 0.1초 대기
            } catch (InterruptedException e) {
    	        e.printStackTrace();
            }
        }
    }
}

class Worker implements Runnable {
    private SharedResource resource;

    public Worker(SharedResource resource) {
	    this.resource = resource;
    }

    @Override
    public void run() {
    	resource.printNumbers(Thread.currentThread().getName());
    }
}

public class SynchronizedExample {
    public static void main(String[] args) {
        SharedResource resource = new SharedResource();

        Thread thread1 = new Thread(new Worker(resource));
        Thread thread2 = new Thread(new Worker(resource));

        thread1.start();
        thread2.start();
    }
}
출력 결과 (순서 보장):
 
Thread-0 - Number: 1
Thread-0 - Number: 2
...
Thread-1 - Number: 1
...

다양한 활용 예시

  1. 병렬 작업 처리:
    • 데이터베이스 쿼리 실행, 파일 처리 등에서 병렬 작업 수행.
  2. UI 애니메이션:
    • GUI 애플리케이션에서 애니메이션이나 타이머 구현.
  3. 멀티플레이어 게임:
    • 각 플레이어의 작업을 독립적으로 처리.
  4. 서버 클라이언트 통신:
    • 각 클라이언트 요청을 독립적으로 처리.
예제: 간단한 타이머 구현
public class TimerExample {
    public static void main(String[] args) {
        Runnable timerTask = () -> {
            for (int i = 10; i >= 1; i--) {
	            System.out.println("Countdown: " + i);
                try {
	                Thread.sleep(1000); // 1초 대기
                } catch (InterruptedException e) {
    	            e.printStackTrace();
                }
            }
            System.out.println("Time's up!");
        };

        Thread timerThread = new Thread(timerTask);
        timerThread.start();
    }
}
출력 결과:
 
Countdown: 10
Countdown: 9
...
Time's up!

마치며

자바 쓰레드는 멀티태스킹과 병렬 처리를 구현하는 데 매우 유용한 도구입니다. 쓰레드의 생성, 실행, 동기화, 다양한 활용 사례를 익히고 적절히 활용하여 효율적인 프로그램을 작성해 보세요!

 
반응형

+ Recent posts