반응형
프로세스와 스레드
멀티 프로세스들은 운영체제에서 할당받은 자신의 메모리를 가지고 실행하기 때문에 서로 독립적이다.
멀티 스레드는 하나의 프로세스 내부에 생성되기 때문에 하나의 스레드가 예외를 발생시키면 프로세스 자체가 종료될 수 있어 다른 스레드에게 영향을 미치게 된다.
그렇기 때문에 멀티 스레드에서는 예외처리에 만전을 기해야 한다.
작업 스레드 생성과 실행
Thread 클래스로부터 직접 생성
- Runnable 인터페이스를 구현하여 사용(아래예제를 참고 3가지 방법이 존재)
public class BeepPrintExample2 { public static void main(String[] args){ // 쓰레드가 동작 Runnable beepTask = new BeepTask(); Thread thread = new Thread(beepTask); // 작업스레드 생성(Runnable 구현체 이용) thread.start(); for(int i=0; i<5; i++){ System.out.println("띵"); try{ Thread.sleep(500);}catch(Exception e){} } } // 익명 객체를 이용하는 방법 Thread thread2 = new Thread(new Runnable() { @Override public void run() { Toolkit toolkit = Toolkit.getDefaultToolkit(); for(int i=0; i<5; i++){ toolkit.beep(); try{ Thread.sleep(500);}catch(Exception e){} // 0.5초간 일시 정지 } } }); // 람다식을 이용하는 방법 (Java 8) Thread thread3 = new Thread(() -> { Toolkit toolkit = Toolkit.getDefaultToolkit(); for(int i=0; i<5; i++){ toolkit.beep(); try{ Thread.sleep(500);}catch(Exception e){} // 0.5초간 일시 정지 } }); } public class BeepTask implements Runnable{ // 스레드 실행 내용 @Override public void run() { Toolkit toolkit = Toolkit.getDefaultToolkit(); for(int i=0; i<5; i++){ toolkit.beep(); try{ Thread.sleep(500);}catch(Exception e){} // 0.5초간 일시 정지 } } }
Thread 하위 클래스로부터 생성
public class BeepPrintExample3 {
public static void main(String[] args){
Thread thread = new BeepThread();
thread.start();
for(int i=0; i<5; i++){
System.out.println("띵");
try{ Thread.sleep(500);}catch(Exception e){}
}
// 익명 객체를 이용하는 방법
Thread thread2 = new Thread(){
@Override
public void run(){
Toolkit toolkit = Toolkit.getDefaultToolkit();
for(int i=0; i<5; i++){
toolkit.beep();
try{ Thread.sleep(500);}catch(Exception e){} // 0.5초간 일시 정지
}
}
};
}
}
public class BeepThread extends Thread{
@Override
public void run() {
Toolkit toolkit = Toolkit.getDefaultToolkit();
for(int i=0; i<5; i++){
toolkit.beep();
try{ Thread.sleep(500);}catch(Exception e){} // 0.5초간 일시 정지
}
}
}
스레드는 start() 메서드를 호출해야만 실행된다. (start() 메소드 호출시, Runnable의 run() 메서드를 실행하면서 자신의 작업을 처리한다.)
=> 이때 Override한 run()메서드를 호출하면 스레드가 제대로 동작하지 않는다.
스레드 우선순위
용어정리
- 동시성(Concurrency) - 하나의 코어에서 멀티 스레드가 번갈아가며 실행하는 성질
- 병렬성(Parallelism) - 멀티 코어에서 개별 스레드를 동시에 실행하는 성질
(출처 : https://codedragon.tistory.com/m/5468)
스레드 개수가 코어의 수보다 많을 경우, 스레드를 어떤 순서에 의해 동시성으로 실행할 것인가를 결정해야 하는데, 이것을 스레드 스케줄링이라고 한다. (아주 짧은 시간에 번갈아가면서 run() 메소드를 실행)
자바의 스레드 스케줄링
- 우선순위(Priority)방식
- 순환 할당(Round-Robin)방식
두 방식을 사용한다.
스레드 우선순위 방식은 스레드 객체에 우선 순위 번호를 부여할 수 있기 때문에 개발자가 코드로 제어할 수 있다. 하지만 순환 할당 방식은 가상 기계에 의해서 정해지기 때문에 코드로 제어할 수 없다.
우선순위 방식의 우선순위는 1~10 부여. 1이 가장 우선순위가 낮고, 10이 가장 높다.
thread.setPriority(우선순위);
// Thread 클래스 상수 제공
thread.setPriority(Thread.Max_PRIORITY); // 10
thread.setPriority(Thread.NORM_PRIORITY); // 5
thread.setPriority(Thread.MIN_PRIORITY); // 1
반응형
'프로그래밍 노트 > JAVA' 카테고리의 다른 글
[JAVA] 스레드 상태(Thread_3) (0) | 2019.03.02 |
---|---|
[JAVA] 동기화 메소드와 동기화 블록(Thread_2) (0) | 2019.03.02 |
[JAVA] 제네릭(Generic) 문법 정리 (4) | 2019.02.12 |
[JAVA] final 필드와 상수, final 클래스와 final 메소드 (0) | 2018.11.26 |
[JAVA] 정적멤버와 static (0) | 2018.11.26 |