Hello

Java 싱글쓰레드와 멀티 쓰레드, 쓰레드의 I/O 블락킹

by 볼빵빵오춘기

main 쓰레드

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

 

예제 코드

더보기
import java.util.*;
import java.lang.annotation.*;

public class Try {
	
	static long startTime = 0;
	
	public static void main(String[] args) {
		ThreadEx11_1 th1 = new ThreadEx11_1();
		ThreadEx11_2 th2 = new ThreadEx11_2();
		th1.start();
		th2.start();
		startTime = System.currentTimeMillis();

		// 주석처리 start
		try {
			th1.join();	// main쓰레드가 th1의 작업이 끝날 때까지 기다린다.
			th2.join();	// main쓰레드가 th2의 작업이 끝날 때까지 기다린다.
		} catch(InterruptedException e) {}
		// 주석처리 end

		System.out.print("소요시간:" + (System.currentTimeMillis() - Try.startTime));
	}
}

class ThreadEx11_1 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()
}

 

결과값

||||||||||||||||----------------------------------|||||||||||||||||||||||||||||||||-------------------------|||||----------|||||||||||||||-|-|||-|||-----------------||-------------------------------------||||||||||||||||||||||||||----------------------------------------------------------------||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--------------------------------------------------------------------------------------------------------------소요시간:18

 

주석처리 결과값

|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||소요시간:0-------|||||||||||-----|||||||-----|||-|--||||||||------||-||||||||||||||||||||||||||||||||||||||||||||--------------||||||||||||||||||||||||||--||||||||||||||||||||||||||||||||||||||||||||-----------------------------------------------------------------------------------------------------------------|-|||||||||||||-||||||||||||||||||||||||-----------------------||----------||---------------------------------------------------------|||||||||||||||||||||||--------------------------------------------------—

 

⇒ 메인 쓰레드 소요시간이 없다.

 

싱글쓰레드와 멀티쓰레드

⇒ 그림은 같은시간이 걸리는것처럼 그려놨지만 순서와 시간은 os의 스케쥴러가 결정하기때문에 우리가 알 수 없다.

⇒ 싱글쓰레드와 멀티쓰레드 작업시간 그래프를 보면 멀티스레드의 그래프가 시간이 조금 더 걸리는 것처럼 나오는 것을 볼 수 있는데 a작업에서 b작업으로 넘어갈 때 b작업에서 a작업으로 넘어갈때 context switch(문맥전환)이 걸리기 때문에 조금 더 걸리는 것이다.

⇒ 이러면 멀티스레드의 장점이 없는것이 아니냐? No 밑에 I/O 블락킹 읽어보기  🔽 🔽 🔽

 

예제 코드

예제 코드 - 싱글 쓰레드

더보기
import java.util.*;

public class Try {

	public static void main(String[] args) {
		long startTime = System.currentTimeMillis();

		for(int i=0; i < 300; i++)
			System.out.printf("%s", new String("-"));		

		System.out.print("소요시간1:" +(System.currentTimeMillis()- startTime)); 

		for(int i=0; i < 300; i++) 
			System.out.printf("%s", new String("|"));		

 		System.out.print("소요시간2:"+(System.currentTimeMillis() - startTime));
	}
}
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------소요시간1:40||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||소요시간2:50

⇒ 두 작업이 겹치지않는 것을 확인 가능하다.

예제 코드 - 멀티 쓰레드

더보기
import java.util.*;

public class Try {

	static long startTime = 0;
	
	public static void main(String[] args) {
		ThreadEx3_1 th1 = new ThreadEx3_1();
		th1.start();
		startTime = System.currentTimeMillis();

		for(int i=0; i < 300; i++)
			System.out.printf("%s", new String("-"));	

		System.out.print("소요시간1:" + (System.currentTimeMillis() - Try.startTime));
	}
}

class ThreadEx3_1 extends Thread {
	public void run() {
		for(int i=0; i < 300; i++)
			System.out.printf("%s", new String("|"));	

		System.out.print("소요시간2:" + (System.currentTimeMillis() - Try.startTime));
	}
}
|||||||||||||||||||||||||||||||||||||----------------------------------------------||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||---------------||||||||||||||||||-------------------------|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--------------------------------------------------||||||||||||||||||||||||||-----------------------------소요시간2:39---------------------------------------------------------------------------------------------------------------------------------------소요시간1:42

⇒ |||| 와 ------ 가 나오는게 매 번 바껴서 결과값이 나온다.

⇒ 두 작업이 번갈아가면서 나오는 것을 확인 가능하다. 

 

쓰레드의 I/O 블락킹(blocking)

  • I/O ⇒ input/output ⇒ 입력/출력 을 줄여서 입출력.
  • 블락킹 ⇒ 막힘

⇒ 즉, I/O 블락킹 ⇒ 입출력시 작업중단

 

예제 코드

예제 코드 - 싱글 쓰레드

더보기
import java.util.*;
import javax.swing.JOptionPane;

public class Try {

	static long startTime = 0;
	
	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);  // 1초간 시간을 지연한다.
			} catch(Exception e ) {}
		}
	}
}

 

값을 입력하기 전까지는 콘솔에 for문이 돌지않는다.

입력을 하면

이제 for문이 돌면서 숫자를 보여준다.

예제 코드 - 멀티 쓰레드

더보기
import java.util.*;
import javax.swing.JOptionPane;

public class Try {

	static long startTime = 0;
	
	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 ) {}
		}
	} // run()
}

⇒ 입력하는 것이 중간떳다가 for문이 완료되었다.

⇒ 입력하기 전까지는 ThreadEx5_1 쓰레드가 먼저 실행하면서 입력값을 받으면 메인쓰레드 진행되고 메인쓰레드가 종료되자 ThreadEx5_1가 계속 진행된 것을 확인 가능하다.

 

블로그의 정보

Hello 춘기's world

볼빵빵오춘기

활동하기