Java

쓰레드

쭈녁 2022. 12. 30. 00:06

프로세스와 쓰레드

프로세스 : 실행중인 프로그램, 자원(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