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가 계속 진행된 것을 확인 가능하다.
'👩🏻💻 About 프로그래밍 > Java' 카테고리의 다른 글
Java 데몬쓰레드(deomon thread), 쓰레드의 상태 (0) | 2023.12.09 |
---|---|
Java 쓰레드의 우선순위, 쓰레드 그룹 (0) | 2023.12.09 |
Java 쓰레드의 구현과 실행 (0) | 2023.12.09 |
Java 프로세스, 쓰레드(process & thread) (1) | 2023.12.09 |
Java 애터네이션 타입 정의하기, 애너테이션 요소 (0) | 2023.12.09 |
블로그의 정보
Hello 춘기's world
볼빵빵오춘기