Post

자바 Thread_13


작업당 스레드 / 요청당 스레드

자바 스레드12의 내용와 이어지는 내용으로 꼭 두 개의 글을 같이 봐야함

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
// 실행할 작업의 수
private static final int NUMBER_OF_TASK = 1000;

    public static void main(String[] args) {
        System.out.println("Enter to start");
        Scanner sc = new Scanner(System.in);
        sc.nextLine();

        long start = System.currentTimeMillis();
        performTask();
        System.out.println("task from Thread: " + (System.currentTimeMillis() - start));
    }

    private static void performTask() {
      // 동적 스레드풀
      // 작업을 완료하는데 필요한 스레드를 계속 생성하고 캐시로 저장해 나중에 재사용함 (현실적 - 작업량이 얼마나인지 모르고, 몇 개의 스레드를 미리 할당해야할지도 모름)
      ExecutorService executorService = Executors.newCashedThreadPool();

        // 최대 스레드풀의 최대 숫자를 정할 수 있음
        //ExecutorService executorService = Executors.newFixedThreadPool(1000);

        
        for (int i = 0; i < NUMBER_OF_TASK; i++) {
            // 반복할때마다 스레드 풀에 있는 스레드중 하나에서 새로운 작업이 실행됨
            //executorService.submit(() -> blockingIoOperation());

            // 작업 하나당 블로킹을 호출하는게 아니라,블로킹 호출을 100번 실행함(10ms x 100 = 1000ms) 
            executorService.submit(new Runnable() {
                @Override
                public void run() {
                    for (int j = 0; j < 100; j++) {
                        blockingIoOperation();

                    }
                }
            });
        }

        executorService.shutdown();
    }


    private static void blockingIoOperation() {
        System.out.println("블로킹 스레드 - " + Thread.currentThread());

        try {
            Thread.sleep(10);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
  • 100번의 블로킹 연산을 통해 99번의 context switch가 일어남
  • 컨텍스트 스위치로 인해 발생하는 부하는 생각보다 많은 시간을 소모하고 실제 예상한 1000ms보다 시간이 더 걸림.



  • 장점은 작업 단위 스레드 모델이 성능과 H/W 성능 향상됨
  • 모든 작업을 동시에 수행이 가능하고 작업 속도가 빠름(코어수 == 스레드수 보다 더 빠름)


  • 단점은 스레드가 비용이 큰 리소스
  • 생성할 수 있는 스레드수는 제한적임
  • 블로킹 호출 대기만 해도 스택메모리와 다른 자원을 소모함
  • 스레드를 많이 할당하면 충돌함, 작게 할당하면 원하는만큼 처리량이 안나옴(CPU를 효율적으로 사용못함)

컨텍스트 스위치 비용

  • OS는 CPU를 효율적으로 쓸려고 노력함
  • 블로킹을 감지하면 차단된 스레드의 스케줄링을 취소하고 진행가능한 다른 스레드를 찾음

스레싱

  • OS가 시스템을 관리하는데 CPU 자원 대부분을 소모하고 그 다음에 스레드가 작업을 하는 상황을 스레싱이라 함(피해야하는 상황!!!)


출처 - https://kmooc.udemy.com/course/java-multi-threading/ (Java 멀티스레딩, 병행성 및 성능 최적화 - 전문가 되기 )

This post is licensed under CC BY 4.0 by the author.