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
볼빵빵오춘기