728x90
데몬 스레드(Demon thread)
- 컴퓨터 프로세스 내의 백그라운드에서 싱행되는 스레드
- 주로 백그라운드 작업을 처리하거나 다른 스레드들을 돕는 역할
- 데몬 스레드는 일반 스레드와 다르게, 해당 프로세스의 모든 일반 스레드가 종료되면 자동적으로 종료됨
- 시스템 리소스를 관리하거나 백그라운드에서 주기적으로 실행되어 작업을 처리함
- 예 ) 웹 서버는 메인 스레드에서 클라이언트 요청을 처리하는 동안 데몬 스레드가 로그 파일을 유지하거나 쓰레기 수집과 같은 자동화된 작업을 처리하는데 사용됨
- 데몬 스레드는 일반 스레드의 보조적인 역할을 하며, 일반 스레드들이 작업을 마친 후에도 백그라운드에서 동작하는데 사용됨
- 언어나 프레임워크에 따라 데몬 스레드를 생성하는 방법이 다를 수 있으며, 대부분의 프로그래밍 언어와 스레드 지원 라이브러리는 데몬 스레드를 지원
[ 데몬 스레드를 생성하는 예시 ]
public class DaemonThreadExample {
public static void main(String[] args) {
// 데몬 스레드로 동작하는 스레드 객체 생성
Thread daemonThread = new Thread(() -> {
while (true) {
System.out.println("데몬 스레드가 실행 중입니다.");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
daemonThread.setDaemon(true); // 데몬 스레드로 설정
daemonThread.start();
// 메인 스레드의 실행 작업 (메인 스레드가 먼저 종료되지 않도록 충분한 시간을 주어야 합니다.)
try {
Thread.sleep(5000); // 5초 동안 메인 스레드 실행
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("메인 스레드 종료");
}
}
스레드를 만드는 방법
Java 에서는 'java.lang.Thread' 클래스를 사용하여 스레드를 생성하는데 두 가지 방법으로 만들 수 있다.
'Thread' 클래스 상속 방법
스레드를 생성하기 위해서는 'Thread' 클래스를 상속하고 'run()' 메서드를 오버라이딩한다.
public class MyThread extends Thread {
@Override
public void run() {
// 스레드가 실행할 작업 내용
}
}
이렇게 만든 'MyThread' 클래스의 객체를 생성하고 start() 메서드를 호출하여 스레드를 실행한다
MyThread myThread = new MyThread();
myThread.start();
start() 메서드는 스레드의 run() 메서드를 실행시키고, 스레드가 별도로 실행된다
* run() 메서드를 직접 호출하면 단순한 메서드 호출로 실행되며, 스레드로서의 동작이 아님
'Runnable' 인터페이스 구현 방법
Java는 단일 상속만을 지원하기 때문에 이미 다른 클래스를 상속한 경우 'Tread' 클래스를 상속하는 방법은 불가능할 수 있기 때문에 'Runnable' 인터페이스를 구현하는 방법을 사용한다
public class MyRunnable implements Runnable {
@Override
public void run() {
// 스레드가 실행할 작업 내용
}
}
이렇게 만든 'MyRunnable' 클래스의 객체를 생성하고 'Tread' 클래스의 생성자에 전달하여 스레드를 생성한다
MyRunnable myRunnable = new MyRunnable();
Thread myThread = new Thread(myRunnable);
myThread.start();
마찬가지로 'start()' 메서드를 호출하여 스레드를 생성한다
이 두 가지 방법 모두 스레드를 생성할 수 있는 방법이지만, Runnable 인터페이스 구현 방법이 더 선호되는 경우가 많습니다. 이는 자바에서는 다중 상속을 지원하지 않기 때문에, 이미 다른 클래스를 상속한 상태에서 스레드 기능을 추가해야 할 때 Runnable 인터페이스를 사용하는 것이 유연성을 높이기 때문입니다.
스레드를 실행시킨 후에는 run() 메서드 안에 스레드가 실제로 처리해야 할 작업 내용을 작성하면 됩니다. 스레드가 해당 작업을 모두 수행하면 run() 메서드가 종료되고, 스레드도 함께 종료됩니다.
또한, 스레드의 실행은 start() 메서드를 호출하여야 하며, 스레드가 종료될 때까지 기다려야 할 경우에는 join() 메서드를 사용하여 기다릴 수 있습니다. 이러한 메서드들은 InterruptedException 예외를 처리해야 할 수도 있으므로 예외 처리에 주의해야 합니다.
728x90
'3.multi-threading' 카테고리의 다른 글
sleep() vs wait() / notify() vs notifyAll() (0) | 2023.07.27 |
---|---|
스레드의 여러가지 상태 (0) | 2023.07.26 |
runnable과 callable의 차이는 ? (0) | 2023.07.25 |
스레드와 프로세스의 차이 (0) | 2023.07.21 |
병렬과 동시성의 차이점 (0) | 2023.07.20 |