자바는 멀티쓰레드를 지원한다.
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 |
댓글