본문 바로가기
IT/자바

ExecutorService

by 모띠 2023. 3. 26.

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

 

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();
				}
			});
		}
	}

 

'IT > 자바' 카테고리의 다른 글

Junit in Action 3판 정리 (1)  (5) 2024.10.10
classpath  (0) 2023.03.26
Java8 람다(Lambda)를 이용한 프로그래밍  (0) 2022.01.23
Java8 스트림(Stream)연산을 사용해보자  (0) 2022.01.23
Java8 람다(Lambda)를 사용해보자  (0) 2022.01.23

댓글