
프로세스와 스레드
프로세스란 ?
프로세스는 일반적으로 cpu에 의해 메모리에 올려져 실행중인 프로그램을 말하며, 자신만의 메모리 공간을 포한한 독립적인 실행 환경을 가지고 있다. 자바 가상 머신 (JVM) 은 주로 하나의 프로세스로 실행되며, 동시에 여러 작업을 수행하기 위해서 멀티 스레드를 지원하고 있다.
스레드란 ?
스레드란 프로세스안에서 실질적으로 작업을 실행하는 단위를 말한다. 스레드 역시 자바가상머신 (JVM)에 의해 관린된다. 프로세스에는 항상 한 개 이상의 스레드가 있으며 main 스레드 하나로 시작하여 스레드를 추가 생성하게 되면 그게 멀티 스레드 환경이 된다. 이러한 멀티 스레드 환경은 프로세스의 리소르르 공유하기 때문에 효율적이긴 하지만 잠재적인 문제점에 노출될 수 있다.
생성자
- Thread() : 새로운 스레드 객체 할당
- Thread(String name) : name 이름의 새로운 스레드 객체가 할당
- Thread(Runnable target) : Runnable target이 구현된 스레드 객체 할당
- Thread(Runnable target, String name) : Runnable target 이 구현된 name 이름의 스레드 객체 할당
메소드를 알아보기 전에 먼저 Runnable 을 구현한 게 뭔지 알아보자
Runnable 인터페이스란 ?
Runnable 인터페이스는 run() 메소드 한 개를 구현하도록 하여 스레드가 시작될 때, 실행될 코드를 구현하는 것이다. 즉, 이름 그대로 실행할 수 있는 코드를 구현함. -> 알아보다보니 Thread 클래스에 관해서도 나와서 정리
Thread 클래스란 ?
스레드 클래스는 자바에서 컴퓨팅 시스템의 스레드의 기능을 구현해준 클래스다. Thread 인스턴스 생성 시 실행될 코드를 Runnable 인터페이싀 run() 메소드를 오버라이딩 하여 구현하고 Thread 클래스에 인젝션해주면 해당 코드가 실행되는 스레드가 생성되는 것
즉, 정리해보면 이렇다
Runnable 인터페이스 : 스레드에서 실행될 코드를 run() 메소드에 구현
Thread 클래스 : 컴퓨팅 시스템의 스레드 기능을 가진 클래스
쓰레드 메소드
- start() -> 쓰레드는 start() 함수를 호출해야만 실행시킬 수 있다. 쓰레드는 한 번 호출하면 다시 호출할 수 없기 때문에 두 번 이상 호출을 시도하는 경우 IllegalThreadStateExcption텍스트 예외를 던진다. 다시 실행하기 위해선 다시 초기화를 해야한다.
- sleep() -> 쓰레드를 일정 시간동안 멈출 수 있다. sleep()메서드가 실행되어 일시정시된 쓰레드는 시간이 다 되거나 interrupt()메서드가 호출되면 다시 재개한다. interrupt() 시 interruptException 예외가 던져지니 반시드 try-catch 안에서 사용해야한다.
- join() -> 다른 쓰레드의 작업을 일정 시간동안 기다리는 메서드이다. join 한 쓰레드가 모두 작업을 마칠때까지 기다린다.
sleep() 과 join은 같은 기능 아닌가 ?
두 메서드가 대기한다는 점은 같다. 하지만 sleep() 메서드는 현재 쓰레드를 기준으로, join() 메서드는 특정 쓰레드를 기준으로 대기한다는 점이 큰 차이이다.
interrupt(), isInterrupted(), Interrupted()
- interrupt() : 진행중인 쓰레드의 작업을 멈추는 요청을 하는 기능 -> 요청이기 때문에 쓰레드를 강제로 종료시키진 않고 interrpted 변수를 true값으로 바꿔줄 뿐이다.
- isInterrupted() : boolean 반환 타입이며 쓰레드의 인터럽트 여부를 확인한다. interrupted() 의 정적 메서드로 현재 진행중인 쓰레드의 인터럽트 여부를 반환하고 이를 false 상태로 변경시켜줘야한다.
쓰레드 우선순위 ?
여러개를 함께 수행할 수 있으니 당연히 우선순위도 정할 수 있어야한다. 우선순위 범위는 1~10까지 이고 숫자가 높을수록 우선순위가 높다. 대표적으로 프로그램이 시작될 때 실행되는 main함수는 메인 쓰레드라고도 불리면 우선순위는 5이다.
데몬 쓰레드
만약 데몬 쓰레드를 설정하지 않고 초단위로 실행되는 쓰레드를 작성한다면 프로그램을 강제종료하지 않는 이상 종료되지 않을 것이다. 그때 사용해야할 메서드가 setDaemon() 이다
- setDaemon() : boolean 형이 파라미터로 던져지며 반드시 start() 함수가 호출되기 전에 setDaemon(true); 가 실행되어야한다. 그렇지 않으면 illegalThreadStateException이 발생한다