ExecutorService

2023. 3. 26. 18:45·개발/java
반응형

자바는 멀티쓰레드를 지원한다.

 

Runnable인터페이스를 구현하여 run()를 오버라이딩하여 사용하는 방법도있겠지만,

 

ExcutorService클래스를 이용하면 보다 효율적으로 멀티쓰레드를 이용할 수 있다.

 

1. newFixedThreadPool

고정된 갯수의 쓰레드풀을 이용한다.

	// 50개 고정
	public void newFixedThreadPool() {
		ExecutorService executorService = Executors.newFixedThreadPool(50);
		for (int i = 0; i < 150; i++) {
			executorService.execute(() -> {
				try {
					System.out.println(Thread.currentThread().getName());
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			});
		}
		executorService.shutdown();
	}

 

2. newCachedThreadPool

제한없이 cpu가 만들수있는만큼 만든다 - 운영에서 사용금지

    // 제한없음
    public void newCachedThreadPool() {
		ExecutorService executorService = Executors.newCachedThreadPool();
		for (int i = 0; i < 150; i++) {
			executorService.execute(() -> {
				try {
					System.out.println(Thread.currentThread().getName());
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			});
		}
		executorService.shutdown();
	}

 

3. ThreadPoolExecutor

위의 2개로 간단히 안된다면 상세설정 가능.

new ThreadPoolExecutor(최초생성개수, 최대생성개수, 각각쓰레드 생존시간, 시간단위, 버퍼큐)

	// 최초 쓰레드풀 0개 생성 - 최대 50개까지 생성, 각각의 스레드는 10초간 생성
	// LinkedBlockingQueue는 120개의 버퍼공간 존재 결국 최대 -170개씩 한번에 돌릴수있음
	// 한번에 바로 풀사이즈로 가는것이 아니라 일단 버퍼에 담아두고 버퍼가 넘칠경우 사이즈를 올림
	// 아래는 최대 120개를 담아뒀지만 30개는 처리가 안되므로 사이즈를 30으로 늘려서 처리
	public void LinkedBlockingQueue() {
		ExecutorService executorService = new ThreadPoolExecutor(0, 50,
		        10L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(120));
		for (int i = 0; i < 150; i++) {
			executorService.execute(() -> {
				try {
					System.out.println(Thread.currentThread().getName());
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			});
		}
	}
    
    // 최초 쓰레드풀 0개 생성 - 최대 50개까지 생성, 각각의 스레드는 10초간 생성
	// SynchronousQueue는 버퍼공간이 없으므로 50개를 초과하면 에러
	public void SynchronousQueue() {
		ExecutorService executorService = new ThreadPoolExecutor(0, 50,
		        10L, TimeUnit.SECONDS, new SynchronousQueue<>());
		for (int i = 0; i < 150; i++) {
			executorService.execute(() -> {
				try {
					System.out.println(Thread.currentThread().getName());
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			});
		}
	}

 

반응형
저작자표시 비영리 변경금지 (새창열림)

'개발 > java' 카테고리의 다른 글

classpath  (0) 2023.03.26
Java8 람다(Lambda)를 이용한 프로그래밍  (0) 2022.01.23
Java8 스트림(Stream)연산을 사용해보자  (0) 2022.01.23
Java8 람다(Lambda)를 사용해보자  (0) 2022.01.23
Java8 옵셔널(Optional<T>)객체 올바르게 사용하기  (0) 2022.01.23
'개발/java' 카테고리의 다른 글
  • classpath
  • Java8 람다(Lambda)를 이용한 프로그래밍
  • Java8 스트림(Stream)연산을 사용해보자
  • Java8 람다(Lambda)를 사용해보자
모띠
모띠
뭐라도 기록하기 위한 블로그
  • 모띠
    모띠의 아티팩토리
    뭐라도 기록하기 위한 블로그
  • 전체
    오늘
    어제
    • 분류 전체보기 (145)
      • 개발 (82)
        • spring (7)
        • java (6)
        • junit (18)
        • infra (19)
        • database (7)
        • open source (18)
        • trouble shooting (1)
        • ETC (6)
      • 경제 (8)
        • 부동산 (3)
        • 주식 (5)
        • ETC (0)
      • 음악생활 (38)
        • 음악 이론 (5)
        • 스케일 연습 (27)
        • 악기 리뷰 (3)
      • 물생활 (9)
        • 어항 관리 (7)
        • 물템 리뷰 (2)
      • 일상 (8)
  • 공지사항

    • 블로그를 시작한 이유
  • 인기 글

  • 태그

    20하이큐브
    메이저 스케일
    기타 스케일
    Java
    JPA
    수초항
    Junit5
    기타 스케일 연습
    junit in action 3
    기타스케일 연습
  • 최근 댓글

  • 최근 글

  • 반응형
  • hELLO· Designed By정상우.v4.10.5
모띠
ExecutorService
상단으로

티스토리툴바