Thread
1 Multi Thread
2 Process와 Thread
2.1 Process
- 프로세스란 실행 중인 프로그램이다
- 프로세스는 종종 프로그램 또는 애플리케이션과 동의어로 간주된다.
- 그러나 사용자가 단일 애플리케이션으로 인식하는 것은 사실 협력 프로세스 집합일 수 있다.
- 프로세스 간 통신(IPC)를 통해 프로세스 집합은 서로 통신한다.
- 프로세스는 독립적이기 때문에 하나의 프로세스에서 오류가 발생해도 다른 프로세스에 영향을 미치지 않는다
- Process.md
2.2 Thread
- 스레드는 사전적 의미로 한 가닥의 실이라는 뜻이다
- 스레드는 경량 프로세스(lightweight processes)라고도 한다.
- 프로세스와 스레드는 모두 실행 환경을 제공하지만, 새 스레드를 만드는 것은 새 프로세스를 만드는 것보다 더 적은 리소스를 필요로 한다.
- 스레드는 프로세스 내에 존재하며, 모든 프로세스에는 하나 이상의 쓰레드가 있다.
- 하나의 스레드가 예외를 발생시키면 프로세스 자체가 종료될 수 있어 다른 스레드에 양향을 미칠 수 있다
- 따라서 멀티 스레드에서는 예외 처리를 잘 해야한다.
- 스레드는 메모리 및 열린 파일을 포함하여 프로세스의 리소스를 공유합니다.
- 이로 인해 효율적이지만 잠재적으로 동시성 문제가 발생할 수 있다.
- Threads.md
3 Main Thread
- 모든 자바 애플리케이션은 메인 스레드가 main() 메소드를 실행하면서 시작합니다.
- 자바는 실행 시점에
main이라는 이름의 스레드를 만들고 프로그램의 시작점인main()메서드를 실행합니다.
- 자바는 실행 시점에
- 싱글 스레드 애플리케이션은 메인 스레드가 종료하면 프로세스도 종료된다
- 멀티 스레드 애플리케이션은 실행 중인 스레드가 하나라도 있으면 프로세스가 종료되지 않는다
- 메인 스레드가 종료되고 작업 스레드가 실행중인 경우 포함
- 메인 스레드는 필요에 따라 작업 스레드를 만들어 병렬로 코드를 실행한다.
4 Thread 생성 및 실행
- 자바에서는 작업 스레드도 객체로 생성된다
- Thread 객체 생성 방법
java.lang.Thread클래스를 객체화해서 사용executor를 사용
4.1 Thread 클래스로 생성
- 작업 스레드 생성시 스레드가 실행할 코드를 제공해야 한다.
- 스레드 생성시 생성자의 인자로 Runnable 인터페이스의 구현체가 들어간다.
- 스레드는 Runnable 인터페이스를 구현한 구현체의 run()메소드를 실행한다.
- 따라서 작업 스레드를 통해 실행하고자 하는 코드를 Runnable 인터페이스를 구현한 구현체의 run()메소드에 작성하면 된다.
- 작업 스레드는 생성되는 즉시 실행되는 것이 아니라
start()메소드를 호출하면 실행된다start()가 호출되면 매개값으로 받은Runnable의run()메소드를 실행하면서 자신의 작업을 처리한다
// 작업 Thread 생성
Thread thread = new Thread();
// 작업 Thread 실행
thread.start();
4.1.1 Runnable 인터페이 스
Runnable은 인터페이스 하나의 추상 메소드를 가지고 있다- 이 메소드가 스레드가 실행할 코드를 의미한다.
Runnable을 구현한 객체가 Thread 생성자의 인자로 들어간다.
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
Runnable 인터페이스를 직접 구현하는 방식
public class ImplementRunnable implements Runnable{
@Override
public void run() {
System.out.println("ImplementRunnable.run");
}
}
public class Main {
public static void main(String[] args) {
ImplementRunnable task = new ImplementRunnable();
// 작업 Thread 생성
Thread thread = new Thread(task);
// 작업 Thread 실행
thread.start();
}
}
Runnable 익명 구현 객체 사용하는 방식
public class Main {
public static void main(String[] args) {
// 작업 Thread 생성
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Main.run");
}
});
// 작업 Thread 실행
thread.start();
}
}
Runnable 익명 구현 객체 사용하는 방식: 람다식 이용
Runnable은 인터페이스는 Functional Interface이기 때문에 람다 표현식을 사용할 수 있다
public class Main {
public static void main(String[] args) {
// 작업 Thread 생성
Thread thread = new Thread(() -> System.out.println("Main.run"));
// 작업 Thread 실행
thread.start();
}
}
4.1.2 Thread 하위 클래스로부터 생성
- 작업 스레드가 실행할 작업을 Runnable로 만들지 않고, Thread의 하위 클래스로 작업 스레드를 정의하면서 작업 내용을 포함시킬 수도 있다.
- Thread 클래스를 상속한 후 run 메소드를 overriding해서 스레드가 실행할 코드를 작성하면 된다.
하위 클래스 직접 생성
public class WorkerThread extends Thread {
@Override
public void run() {
//스레드가 실행할 코드
}
}
익명 구현 객체 이용
Thread thread = new Thread() {
public void run() {
//스레드가 실행할 코드
}
}
스레드 실행
thread.start()
4.2 Thread 실행
- 스레드 객체를 생성한 다음에
start()메서드를 호출하면 자바는 스레드를 위한 별도의 스택 공간을 할당합니다. start()대신run()메서드를 직접 호출하면 새로운 스레드가 생성되지 않고 현재 스레드에서run()메서드가 실행되니 주의해야 합니다.
5 Daemon Thread
- 스레드는 사용자 스레드와 데몬 스레드로 구분됩니다.
- 사용자 스레드
- 프로그램의 주요 작업을 수행합니다.
- 작업이 완료될 때까지 실행됩니다.
- 모든 user 스레드가 종료되면 JVM도 종료됩니다.
- 데몬 스레드
- 백그라운드에서 보조적인 작업을 수행합니다.
- 모든 user 스레드가 종료되면 데몬 스레드는 자동으로 종료됩니다.
- JVM은 데몬 스레드의 실행 완료를 기다리지 않고 종료됩니다.
5.1 데몬 스레드 생성
package thread.start;
public class DaemonThreadMain {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName() + ": main() start");
DaemonThread daemonThread = new DaemonThread();
daemonThread.setDaemon(true); // 데몬 스레드 여부
daemonThread.start();
System.out.println(Thread.currentThread().getName() + ": main() end");
}
static class DaemonThread extends Thread {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + ": run() start");
try {
Thread.sleep(10000); // 10초간 실행
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(Thread.currentThread().getName() + ": run() end");
}
}
}
setDaemon(true): 데몬 스레드로 설정합니다.- 데몬 스레드 여부는
start()실행 전에 결정해야 합니다. 이후 변경할 수 없습니다. - 기본 값은
false입니다. (user 스레드가 기본)
6 Thread 정보
Thread클래스는 스레드를 생성하고 관리하는 기능을 제공한다.Thread클래스가 제공하는 정보들을 확인해보자.