프로세스와 쓰레드
프로세스 : 실행중인 프로그램, 자원(resources)과 쓰레드로 구성
쓰레드 : 프로세스 내에서 실제 작업을 수행, 모든 프로세스는 최소한 하나의 쓰레드를 가지고 있다
- 프로세스 : 쓰레드 = 공장 : 일꾼
- 싱글 쓰레드 = 자원+단일 쓰레드
- 멀티 쓰레드 = 자원+복수 쓰레드
- 하나의 새로운 프로세스를 생성하는 것 보다 하나의 새로운 쓰레드를 생성하는것이 더 적은 비용이 든다
멀티쓰레드의 장단점
장점
시스템 자원을 보다 효율적으로 사용할 수 있다
사용자에 대한 응답성 (responseness)이 향상된다
작업이 분리되어 코드가 간결해 진다.
단점 (프로그래밍할 때 고려해야 할 사항들이 많다.)
동기화(synhoronization)에 주의해야한다.
교착상태(dead-lock)가 발생하지 않도록 주의해야한다.
각 쓰레드가 효율적으로 고르게 실행될 수 있게 해야한다.
main 쓰레드
- main메서드의 코드를 수행하는 쓰레드
- 쓰레드는 '사용자 쓰레드'와 '데몬 스레드' 두종류가 있다
- 실행중인 사용자 쓰레드가 하나도 없을 때 프로그램은 종료된다
- 메인 쓰레드가 없더라도 사용자 쓰레드가 아직 남아있다면 종료되지 않는다
싱글쓰레드와 멀티쓰레드(예시)
싱글 쓰레드
- 1번 반복문을 전부 수행한 후, 2번 반복문을 수행함
class ThreadTest{
public static void main(String arg[]) {
for(int i=0; i<300;i++){
System.out.println("-");
}
for(int i=0; i<300;i++){
System.out.println("|");
}
}
}
멀티 쓰레드
- 1번과 2번 반복문이 랜덤으로 번갈아가면서 수행 된다. (시간과 순서는 같지 않음)
class ThreadTest {
public static void main(String args[]) {
ThreadEx11_1 th1 = new ThreadEx11_1();
ThreadEx11_2 th2 = new ThreadEx11_2();
th1.start();
th2.start();
}
}
class MyThread1 extends Thread {
public void run() {
for(int i=0; i < 300; i++) {
System.out.print(new String("-"));
}
} // run()
}
class ThreadEx11_2 extends Thread {
public void run() {
for(int i=0; i < 300; i++) {
System.out.print(new String("|"));
}
} // run()
}
쓰레드의 I/O블락킹(blocking)
- 싱글 쓰레드로 수행된 2개 코드(입력값 받기 && 10초 카운트)
- 싱글 쓰레드로 수행되어 입력되지 않는 구간은 정지 발생
class Ex13_9 {
public static void main(String[] args){
String input = JOptionPane.showInputDialog("값을 입력하시오.");
System.out.println("입력하신 값은 " + input + "입니다.");
for(int i=10; i>0; i++){
System.out.println(i);
try{Thread.sleep(1000);}
catch(Exception e){}
}
}
}
멀티 쓰레드로 실행되는 코드
- 별도의 2개 쓰레드가 동시 진행됨으로 정지 구간이 발생하지 않음
class Ex13_9 {
public static void main(String[] args){
ThreadEx th1 = new ThreadEx();
th1.start();
String input = JOptionPane.showInputDialog("값을 입력하시오.");
System.out.println("입력하신 값은 " + input + "입니다.");
}
}
class ThreadEx extends Thread{
public void run(){
for(int i=10; i>0; i++){
System.out.println(i);
try{Thread.sleep(1000);}
catch(Exception e){}
}
} //run
}
쓰레드의 우선순위(priority of thread)
- 작업의 중요도에 따라 쓰레드의 우선순위를 다르게 하여 특정 쓰레드가 더 많은 작업 시간을 갖게 할 수 있다.
- 우선 순위가 높은 쓰레드가 더 많은 작업시간을 갖는다
void setPriority(int newPriority) //쓰레드의 우선순위를 지정한 값으로 변경한다
int getPriority() //쓰레드의 우선순위를 반환한다.
//Win OS에선 32단계까지 있음
public static fanal int MAX_PRIORITY = 10; //최대우선순위
public static fanal int MIN_PRIORITY = 1; //최소우선순위
public static fanal int NORM_PRIORITY = 5; //보통우선순위
'Java' 카테고리의 다른 글
리플렉션과 동적 프록시 (0) | 2024.01.06 |
---|---|
객체지향의 5가지 원칙 (SOLID) (2) | 2023.12.22 |
switch case문 (Java 14~) (1) | 2023.12.06 |