Java 기초 (쓰레드)

Soondol·2024년 3월 14일

프로세스

운영체제로부터 자원을 할당받는 작업의 단위
Code - Data - Memory(Stack, Heap) 구조

쓰레드

프로세스가 할당받은 자원을 이용하는 실행의 단위

public class Main {
    public static void main(String[] args) {

    }
}


Java 프로그램 쓰레드
Java Main 쓰레드로부터 실행 > JVM에 의해 실행  

Java는 멀티쓰레드를 지원한다 ( 작업 쓰레드들의 병렬 )

싱글쓰레드

  • Main() 메소드만 실행시켰을때 > 싱글쓰레드

멀티쓰레드

  • Main 쓰레드 외에 다른 작업 쓰레드들을 생성하여 여러개의 실행 흐름
  • 장점
  1. 여러개의 작업을 동시에 할 수 있음 > 성능 향상
  2. Stack 제외 모든 영역에서 Memory를 공유 > 자원의 효율적 사용
  3. 응답, 작업 쓰레드를 분리해 빠르게 응답을 줄 수 있음 > 비동기
  • 단점
  1. 동기화문제
  2. 교착상태 (데드락) - 서로 점유하고있는 resource를 내놓지 않아 무한하게 기다리게 되는 상황
  3. 걸리는 시간이나 동작 예측불가

쓰레드의 사용

  1. 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();
        }
    }
  1. 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();
        }
    }
  1. 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)

0개의 댓글