프로세스와 쓰레드 -2

Bloooooooooooooog..·2023년 2월 26일
1

main쓰레드

main 메서드의 코드를 수행하는 쓰레드. 쓰레드에는 '사용자 쓰레드'와 '데몬 쓰레드' 두 종류가 있다. 데몬 쓰레드는 보조 쓰레드이다.
프로그램은 사용자 쓰레드가 하나도 없을 때 종료된다.

public class ExThread {
	static long startTime=0;

	public static void main(String[] args) {
		ThreadEx1 th1 = new ThreadEx1();
		ThreadEx2 th2 = new ThreadEx2();
		th1.start();
		th2.start();
		startTime = System.currentTimeMillis();
		
		System.out.println("소요시간 : " + (System.currentTimeMillis()-startTime));
		// 멀티 쓰레드 방식으로 실행
	}


}

class ThreadEx1 extends Thread { // Thread 클래스를 상속 받아 구현하는 방식
	public void run() {
		for (int i=0; i<100; i++) { 
			System.out.println(new String("-"));
		}
	}
}

class ThreadEx2 extends Thread { // Thread 클래스를 상속 받아 구현하는 방식
	public void run() {
		for (int i=0; i<100; i++) { 
			System.out.println(new String("|"));
		}
	}
}

위와 같이 멀티 쓰레드 방식으로 실행하면 소요시간이 출력된 후에 두 개의 쓰레드가 출력된다. 메인 메소드가 먼저 실행하면서 print 구문을 실행하고 그 뒤에 쓰레드가 진행되기 때문이다.

public class ExThread {
	static long startTime=0;

	public static void main(String[] args) {
		ThreadEx1 th1 = new ThreadEx1();
		ThreadEx2 th2 = new ThreadEx2();
		th1.start();
		th2.start();
		startTime = System.currentTimeMillis();
		
		try {
			th1.join(); // th1의 작업 종료까지 main쓰레드가 기다리게 된다.
			th2.join(); // ht2의 작업 종료까지 main쓰레드가 기다리게 된다.
		}catch(Exception e) {
			
		}
		
		System.out.println("소요시간 : " + (System.currentTimeMillis()-startTime));
		// 멀티 쓰레드 방식으로 실행
	}
}

코드를 위와 같이 변경한다고 하면 소요시간이 쓰레드가 종료될 때까지의 시간값이 나오게 된다. join메서드는 실행한 쓰레드 종료까지 메인 메서드가 대기하게 하는 기능을 한다.

쓰레드의 I/O 블로킹

쓰레드가 I/O과정 중 작업을 중단하고 기다리는 것을 의미한다. 가령 사용자에게 값을 입력해서 출력하는 쓰레드와, 단순히 수를 출력하는 쓰레드를 싱글 쓰레드 방식으로 진행한다고 생각해보자.

수를 출력하는 두 번째 쓰레드는 사용자가 값을 입력하는 첫 번째의 쓰레드가 종료될 때까지 작업을 중단하고 기다릴 수밖에 없다.

하지만 만약 멀티 쓰레드 방식으로 진행하면 사용자가 입력을 하기 위해 대기하는 동안에 다른 쓰레드는 작업을 진행할 수 있기 때문에 훨씬 효율적으로 일을 수행할 수 있다.

profile
공부와 일상

0개의 댓글