코린이의 소소한 공부노트

싱글쓰레드와 멀티쓰레드의 실행 본문

Java

싱글쓰레드와 멀티쓰레드의 실행

무지맘 2022. 11. 30. 00:48

[실행에서의 차이]

1. 싱글쓰레드는 순서대로 실행된다.

class ThreadTest{ // 싱글쓰레드 테스트
    public static void main(String args[]){
        for(int i=0 ; i<300 ; i++)
            System.out.print(“a”);
        for(int i=0 ; i<300 ; i++)
            System.out.print(“b”);
    }
}
// 결과
aaa...aaabbb...bbb // a가 300번 출력된 후 b가 300번 출력된다.

2. 멀티쓰레드는 OS스케줄러가 정한 순서에 따라 실행되며, 실행 시간도 스케줄러가 정한다.

// MyThread1의 run()
for(int i=0 ; i<300 ; i++)
    System.out.print(“a”);
    
// MyThread2의 run()
for(int i=0 ; i<300 ; i++)
    System.out.print(“b”);

class ThreadTest{ // 멀티쓰레드 테스트
    public static void main(String args[]){
        MyThread1 t1 = new MyThread1();
        MyThread2 t2 = new MyThread2();
        t1.start();
        t2.start();
    }
}
// 결과
aaaaabbbaaabb...bbbaaa // a과 b가 뒤섞여서 300개씩 출력된다.

3. 같은 작업을 싱글쓰레드와 멀티쓰레드로 각각 실행하면, 멀티쓰레드가 실행시간이 더 길다.

  - 실행하는 쓰레드를 바꾸는 것을 context switching이라 하는데, 이때 실행하는 작업의 정보를 바꾸는 시간이 소요되어 싱글쓰레드보다 전체 실행시간이 더 길다.

  - 위의 예시에서는 멀티쓰레드 테스트에서 a를 출력하다가 b로 바꾸고, 다시 a로 바꾸는 과정에서 싱글쓰레드 테스트보다 시간이 좀 더 걸리게 된다.

 

[쓰레드의 Input/Output 블로킹]

1. 싱글쓰레드에서 사용자에게 입력받기 + 10초 거꾸로 세기 실행

import javax.swing.JOptionPane;

// main()
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) {}
}

2. 멀티쓰레드로 사용자에게 입력받기 + 10초 거꾸로 세기 실행

import javax.swing.JOptionPane;

// main()
ThreadEx th1 = new ThreadEx();
th1.start();
String input = JOptionPane.showInputDialog("아무 값이나 입력하세요."); 
System.out.println("입력하신 값은 " + input + "입니다.");

// ThreadEx의 run()
for(int i=10 ; i>0 ; i--) {
    System.out.println(i);
    try { Thread.sleep(1000);  // 1초간 시간을 지연한다.
    }catch(Exception e) {}
}

3. 위의 두 예시의 결과

  - 싱글쓰레드의 경우, "아무 값이나 입력하세요." 패널이 뜨고 사용자의 입력을 기다리는 동안 main 쓰레드는 블로킹당한다. 사용자가 입력을 해야 println()이 실행되고 그다음 10부터 1까지 출력되고 프로그램이 종료된다.

  - 멀티쓰레드의 경우, "아무 값이나 입력하세요." 패널이 뜨고 사용자의 입력을 기다리는 동안 main 쓰레드는 블로킹당하고 그 사이에 th1 쓰레드가 실행된다. 입력을 하지 않아도 10부터 출력된다. 중간에 입력을 하면 println()이 실행되고 th1의 작업이 남아있다면 마저 출력을 하고 출력이 끝나면 프로그램이 종료된다.

  - 이 경우에는 멀티쓰레드의 실행시간이 더 짧다.

'Java' 카테고리의 다른 글

데몬 쓰레드와 쓰레드의 실행제어, 상태  (0) 2022.12.09
쓰레드의 우선순위와 그룹  (0) 2022.11.30
쓰레드의 구현 방법과 실행  (0) 2022.11.30
쓰레드의 정의  (0) 2022.11.24
애너테이션 만들기  (0) 2022.11.21