프로세스
운영체제로부터 자원을 할당받는 작업의 단위
Code - Data - Memory(Stack, Heap) 구조
쓰레드
프로세스가 할당받은 자원을 이용하는 실행의 단위
public class Main {
public static void main(String[] args) {
}
}
Java 프로그램 쓰레드
Java Main 쓰레드로부터 실행 > JVM에 의해 실행
Java는 멀티쓰레드를 지원한다 ( 작업 쓰레드들의 병렬 )
싱글쓰레드
- Main() 메소드만 실행시켰을때 > 싱글쓰레드
멀티쓰레드
- Main 쓰레드 외에 다른 작업 쓰레드들을 생성하여 여러개의 실행 흐름
- 장점
- 여러개의 작업을 동시에 할 수 있음 > 성능 향상
- Stack 제외 모든 영역에서 Memory를 공유 > 자원의 효율적 사용
- 응답, 작업 쓰레드를 분리해 빠르게 응답을 줄 수 있음 > 비동기
- 단점
- 동기화문제
- 교착상태 (데드락) - 서로 점유하고있는 resource를 내놓지 않아 무한하게 기다리게 되는 상황
- 걸리는 시간이나 동작 예측불가
쓰레드의 사용
- Thread Class 이용 (상속) - 해당 클래스를 인스턴스화 하여 사용
public class A extends Thread { @Override public void run() { // 실제 쓰레드에서 수행할 작업 } } public class Main { public static void main(String[] args) { A a = new A(); a.start(); } }
- Runnable Interface 사용
(Thread 클래스를 상속받으면 다른 클래스를 상속받을 수 없어 일반적으로 Runnable 인터페이스를 구현하는 방법으로 Thread를 생성함)public class B implements Runnable { @Override public void run() { // 실제 쓰레드에서 수행할 작업 } } public class Main { public static void main(String[] args) { Runnable run = new B(); Thread thread = new Thread(run); thread.start(); } }
- Lambda 식 이용
Runnable task = () -> { // 실제 쓰레드에서 수행할 작업 } Thread thread1 = new Thread(task); thread1.setName("thread1"); thread1.start();
데몬 쓰레드
background에서 실행되는 낮은 우선순위를 가진 쓰레드 (ex, 가비지 컬렉터)
-> 상대적으로 다른 쓰레드에 비해 리소스를 적게 할당받음Runnable demon = () -> { // 실행 작업 } Thread thread = new Thread(demon); thread.setDaemon(true); // true 이면 daemon으로서 설정! thread.start();
사용자 쓰레드
foreground에서 실행되는 높은 우선순위를 가진 쓰레드 (ex, 메인쓰레드)
-!- JVM은 사용자 쓰레드의 작업이 끝나면 데몬쓰레드도 자동으로 종료시킴
쓰레드 우선순위
우선순위는 (최대 = 10 / 보통 = 5 / 최소 = 1, JVM에서 설정한 우선순위) 로 나뉨
setPriority() 메소드로 설정 가능!
Thread thread1 = new Thread(task);
thread1.setPriority(7);
getPriority() 메소드로 세팅된 현재 우선순위 확인 가능
쓰레드 그룹
ThreadGroup group1 = new ThreadGroup("group1"); // 쓰레드 객체 생성시 첫번째 매개변수로 그룹을 넣어줌. Thread thread1 = new Thread(group1, task, name); // 쓰레드에 그룹 할당된것 확인 System.out.println(thread1.getThreadGroup().getName()); thread1.start();
쓰레드의 상태
쓰레드 객체 생성 (NEW)
-> start()
-> 실행 대기 Runnable <-반복-> 실행
-> 종료 Terminated
객체생성 (NEW)
실행대기 (RUNNABLE)
일시정지 (WAITING)
일시정지 (TIMED_WAITING)
일시정지 (BLOCKED)
종료 (TERMINATED)