>  기사  >  Java  >  Java 동시성 패키지: 실행자를 통해 Java에서 제공하는 4개의 스레드 풀

Java 동시성 패키지: 실행자를 통해 Java에서 제공하는 4개의 스레드 풀

php是最好的语言
php是最好的语言원래의
2018-08-01 11:53:301706검색

Java의 네 가지 스레드 풀 newCachedThreadPool, newFixedThreadPool, newScheduledThreadPool, newSingleThreadExecutor

new Thread의 단점

a.
b. 스레드의 통합 관리가 부족하면 무제한의 새 스레드가 생성되고, 서로 경쟁할 수 있으며, 너무 많은 시스템 리소스를 차지하여 충돌이나 OOM이 발생할 수 있습니다.
c. 예약 실행, 주기적 실행, 스레드 중단 등 추가 기능이 부족합니다.
새 스레드와 비교하여 Java에서 제공하는 4가지 스레드 풀의 이점은 다음과 같습니다.
a. 기존 스레드를 재사용하고 객체 생성 및 삭제 비용을 줄이며 성능이 좋습니다.
b. 최대 동시 스레드 수를 효과적으로 제어하고, 시스템 리소스 사용을 개선하며, 과도한 리소스 경쟁과 혼잡을 방지할 수 있습니다.
c. 예약 실행, 주기적 실행, 단일 스레드, 동시성 제어 등의 기능을 제공합니다.

Java는 Executor를 통해 다음과 같은 4개의 스레드 풀을 제공합니다.
newCachedThreadPool은 캐시 가능한 스레드 풀을 생성합니다. 스레드 풀 길이가 처리 요구 사항을 초과하면 유휴 스레드를 유연하게 재활용할 수 있으며 재활용이 없으면 새 스레드가 생성됩니다.
newFixedThreadPool은 대기열에서 대기하는 최대 동시 스레드 수를 제어할 수 있는 고정 길이 스레드 풀을 생성합니다.
newScheduledThreadPool은 예약되고 주기적인 작업 실행을 지원하기 위해 고정 길이 스레드 풀을 생성합니다.
newSingleThreadExecutor는 고유한 작업자 스레드만 사용하여 작업을 실행하는 단일 스레드 스레드 풀을 생성하여 모든 작업이 지정된 순서(FIFO, LIFO, 우선 순위)로 실행되도록 보장합니다.

(1).newCachedThreadPool
스레드 풀 길이가 처리 요구 사항을 초과하는 경우 유휴 스레드를 재활용할 수 있는 방법이 없으면 새 스레드를 생성합니다. 샘플 코드는 다음과 같습니다.

ExecutorService cachedThreadPool = Executors.newCachedThreadPool();for (int i = 0; i < 10; i++) {final int index = i;try {Thread.sleep(index * 1000);} catch (InterruptedException e) {e.printStackTrace();} cachedThreadPool.execute(new Runnable() { @Overridepublic void run() {System.out.println(in
dex);}});}

스레드 풀은 무한합니다. 두 번째 작업이 실행되면 첫 번째 작업이 완료되고, 매번 새 스레드를 생성하지 않고 첫 번째 작업을 실행하는 스레드가 재사용됩니다.

(2).newFixedThreadPool
최대 동시 스레드 수를 제어할 수 있는 고정 길이 스레드 풀을 생성하며 초과 스레드는 대기열에서 대기합니다. 샘플 코드는 다음과 같습니다.

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
for (int i = 0; i < 10; i++) {
final int index = i;
fixedThreadPool.execute(new Runnable() {
 
@Override
public void run() {
try {
System.out.println(index);
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}

스레드 풀 크기가 3이기 때문에 각 작업은 인덱스 출력 후 2초 동안 sleep하므로 2초마다 3개의 숫자가 출력됩니다.

고정 길이 스레드 풀의 크기는 시스템 리소스에 따라 가장 잘 설정됩니다. Runtime.getRuntime().availableProcessors()와 같은 것입니다. PreloadDataCache를 참조하세요.

(3) newScheduledThreadPool
예약 및 주기적인 작업 실행을 지원하기 위해 고정 길이 스레드 풀을 만듭니다. 지연 실행에 대한 샘플 코드는 다음과 같습니다. ScheduledExecutorService ScheduleThreadPool =

Executors.newScheduledThreadPool(5);
scheduledThreadPool.schedule(new Runnable() {
 
@Override
public void run() {
System.out.println("delay 3 seconds");
}
}, 3, TimeUnit.SECONDS);

는 3초 동안 지연 실행을 의미합니다.

정기 실행을 위한 샘플 코드는 다음과 같습니다.

scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
 
@Override
public void run() {
System.out.println("delay 1 seconds, and excute every 3 seconds");
}
}, 1, 3, TimeUnit.SECONDS);

는 1초 지연 후 3초마다 실행한다는 의미입니다.

ScheduledExecutorService는 Timer보다 더 안전하고 강력합니다. 나중에 비교를 위한 별도의 기사가 나올 것입니다.

(4), newSingleThreadExecutor
작업을 실행하는 데 유일한 작업 스레드만 사용하여 모든 작업이 지정된 순서(FIFO, LIFO, 우선 순위)로 실행되도록 하는 단일 스레드 스레드 풀을 만듭니다. 샘플 코드는 다음과 같습니다.

ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) {
final int index = i;
singleThreadExecutor.execute(new Runnable() {
 
@Override
public void run() {
try {
System.out.println(index);
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}

결과가 순차적으로 출력됩니다. 이는 각 작업을 순차적으로 실행하는 것과 같습니다.

대부분의 최신 GUI 프로그램은 단일 스레드입니다. Android의 단일 스레드는 데이터베이스 작업, 파일 작업, 애플리케이션 일괄 설치, 애플리케이션 일괄 삭제 및 동시성에 적합하지 않지만 IO 차단을 유발하고 UI 스레드의 응답에 영향을 줄 수 있는 기타 작업에 사용할 수 있습니다.

스레드 풀의 역할:

스레드 풀의 역할은 시스템의 실행 스레드 수를 제한하는 것입니다.
 시스템 환경에 따라 스레드 수를 자동 또는 수동으로 설정하여 최상의 작업 효과를 얻을 수 있으며 시스템 리소스 낭비가 줄어들고 시스템 혼잡과 비효율이 발생합니다. 스레드 풀을 사용하여 스레드 수를 제어하고 다른 스레드는 줄을 서서 기다립니다. 작업이 실행된 후 대기열의 맨 앞에 있는 작업이 선택되고 실행이 시작됩니다. 대기열에 대기 중인 프로세스가 없으면 스레드 풀의 이 리소스가 대기 중입니다. 새 작업을 실행해야 할 때 스레드 풀에 대기 중인 작업자 스레드가 있으면 실행을 시작할 수 있습니다. 그렇지 않으면 대기 대기열에 들어갑니다.

스레드 풀을 사용하는 이유:

1. 스레드 생성 및 소멸 횟수를 줄이면 각 작업자 스레드를 재사용하고 여러 작업을 수행할 수 있습니다.

2. 과도한 메모리 소모로 인해 서버가 소진되는 것을 방지하기 위해 시스템 용량에 따라 스레드 풀에서 작동하는 스레드 수를 조정할 수 있습니다. (각 스레드에는 약 1MB의 메모리가 필요하며 더 많은 스레드가 열릴수록 더 많은 메모리가 소비되고 결국 충돌이 발생합니다.)

Java에서 스레드 풀의 최상위 인터페이스는 Executor이지만 엄밀히 말하면 Executor는 스레드 풀이 아니라 스레드를 실행하기 위한 도구일 뿐입니다. 실제 스레드 풀 인터페이스는 ExecutorService입니다.

관련 기사:

Java의 스레드 풀 그래픽 코드에 대한 자세한 설명

Java 동시 프로그래밍에서 스레드 풀의 사용에 대한 자세한 설명

관련 동영상:

Java 멀티 스레딩 및 동시성 라이브러리 고급 응용 프로그램 비디오 튜토리얼

위 내용은 Java 동시성 패키지: 실행자를 통해 Java에서 제공하는 4개의 스레드 풀의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.