프로세스
: 프로그램을 수행하는 데 필요한 데이터와 메모리 등의 자원 그리고 쓰레드로 구성되어있다.
멀티 쓰레드 프로세스
: 둘 이상의 쓰레드를 가진 프로세스
멀티 쓰레딩
하나의 프로세스 내에서 여러 쓰레드가 동시에 작업을 수행하는 것이다.
대부분의 OS는 멀티 쓰레딩을 지원한다.
쓰레드 구현하기 위한 방법으로는 두 가지가 있다.
1. Thread 클래스 상속
public class MyThread extends Thread {
public void run(){
}
}
2. Runnable 인터페이스 구현하기
public class MyThread extends Thread {
public void run(){
}
}
Runable 클래스는 run() 함수로만 정의되어있는 인터페이스이다.
public class ThreadEx1 {
public static void main(String[] args) {
ThreadEx1_1 t1 = new ThreadEx1_1();
Runnable r = new ThreadEx1_2();
Thread t2 = new Thread(r);
t1.start();
t2.start();
}
}
class ThreadEx1_1 extends Thread{
public void run(){
for(int i =0; i< 5; i++){
System.out.println(getName());
}
}
}
class ThreadEx1_2 implements Runnable{
public void run(){
for(int i =0; i < 5; i++){
// Thread.currentThread() 로 현재 실행중인 Thread 반환하기
System.out.println(Thread.currentThread().getName());
}
}
}
Ex1에서 볼 수 있듯이, Runnable 인터페이스로 구현한 경우, Runnable 인터페이스를 구현한 클래스의 인스턴스를 생성
Thread 클래스의 매개변수로 전달해주어야 한다.
생성자를 통해서 Runnable 인터페이스를 구현한 인스턴스를 참조하도록 되어있는 것이다.
Thread 클래스의 메서드는 바로 호출할 수 있지만, Runnable을 구현한 경우에는 쓰레드에 대한 참조를 얻어와야함
start() 메소드 : 쓰레드 실행
모든 쓰레드는 독립적인 작업을 수행, 자신만의 호출 스택을 필요로 한다.
start는 새로운 쓰레드가 작업을 실행하는 데 필요한 호출 스택을 생성한 다음에 run을 호출한다.
import javax.swing.*;
public class ThreadEx5 {
public static void main(String[] args) {
ThreadEx5_1 th1 = new ThreadEx5_1();
th1.start();
String input = JOptionPane.showInputDialog("아무 값이나 입력하세요 : ");
System.out.println("입력하신 값은" + input + "입니다.");
}
}
class ThreadEx5_1 extends Thread{
public void run(){
for(int i = 10;i > 0; i--){
System.out.println(i);
try{
sleep(1000);
}catch (Exception e) {}
}
}
}
사용자로부터 입력받는 부분, 화면에 숫자를 출력하는 부분을 두개의 쓰레드로 나누어서 처리
-> 입력을 마치지 않아도 화면에 숫자가 출력된다.
4. 쓰레드의 우선 순위
쓰레드는 우선 순위(priority)라는 속성(멤버 변수)를 가지고 있는데, 이 값에 따라 쓰레드가 얻는 실행시간이 달라진다.
void setPriority(int newPriority); // 값 변경
int getPriority();
우선 순위는 쓰레드를 생성한 쓰레드로부터 상속받는다.
쓰레드를 실행하기 전에만 우선순위를 변경할 수 있으며
우선 순위가 다르면, 우선순위가 높은 쓰레드가 실행 시간이 더 늘어나게 되는 것이다.
5. 쓰레드 그룹(Thread Group)
여러가지 쓰레드를 나누어서 함께 관리하는 것을 쓰레드 그룹이라고 한다.
main 쓰레드 그룹, system 쓰레드 그룹 등이 있는데,
우리가 생성하는 쓰레드들은 main 쓰레드 그룹의 하위 쓰레드 그룹이 된다.
ThreadGroup getThreadGroup() // 자신이 속한 쓰레드 그룹을 반환한다.
void uncaughtException(Thread t, Throwable e) // 예외에 의해 실행이 종료되었을 때, JVM이 이 메서드를 자동으로 호출
이렇게 쓰레드 그룹의 정보를 확인할 수 있고,
main.list() 명령어로 쓰레드 그룹의 정보를 확인할 수 있다.
6. 데몬 쓰레드(Demon Thread)
다른 일반 쓰레드의 작업을 돕는 보조적인 역할을 수행하는 쓰레드
프로그램 실행 시 JVM은 프로그램이 실행되는 데 필요한 보조작업을 수행하는 데몬 쓰레드들을 자동적으로 생성, 실행
7. 쓰레드의 실행 제어
- sleep(long millis) 지정된 시간동안 쓰레드를 멈추게 함
- interrupt() 쓰레드에게 작업을 멈추라고 요청. 즉 쓰레드의 interrupted 상태를 false에서 true로 변경
- suspend()는 sleep()처럼 resume()가 호출될때까지 쓰레드를 멈추게 한다.
- yield() 다른 쓰레드에게 자신에게 주어진 실행시간을 양보한다.
- join() 다른 쓰레드의 작업을 기다린다
'Langauge > Java' 카테고리의 다른 글
자바의 정석 Chapter12. 지네릭스, 열거형, 애너테이션 (0) | 2022.04.05 |
---|---|
Java의 정석 Chapter10. 날짜와 시간 & 형식화 / Chapter11. 컬렉션 프레임워크 (0) | 2022.03.29 |
Java의 정석 Chapter9. java.lang 패키지와 유용한 클래스 (0) | 2022.03.21 |
Java의 정석 Chapter8. 예외처리(Exception Handling) (0) | 2022.03.21 |
Java InputStream에서 File 객체로 변환하기 (0) | 2022.03.21 |