ThreadPool 스레드 풀
1.1 소개
. 데이터베이스 연결 풀이 없으면 데이터베이스에 대한 연결 풀을 얻기 위해 매번 새로운 연결이 필요합니다. 반복적인 연결 및 해제 작업은 많은 시스템 리소스를 소비하게 되며 데이터베이스 연결 풀을 사용하고 풀에서 직접 연결 풀을 가져올 수 있습니다. 마찬가지로 스레드 풀이 있기 전에도 new Thread.start()를 통해 스레드를 얻었습니다. 이제 새 스레드가 필요하지 않으므로 재사용을 달성하고 시스템을 더욱 효율적으로 만들 수 있습니다.
1.2. 스레드 풀을 사용하는 이유
예:
10년 전 단일 코어 CPU 컴퓨터, 가짜 멀티 스레딩, 여러 공을 가지고 노는 서커스 광대처럼 CPU를 앞뒤로 전환해야 합니다.
스레드 풀이 하는 일은 실행 중인 스레드 수를 제어하고 처리 중에 작업을 대기열에 넣은 다음 스레드가 생성된 후에 이러한 작업을 시작하는 것입니다. 스레드 수가 최대 수량을 초과하면, 그 수를 초과하는 스레드는 줄을 서고 다른 스레드가 실행을 완료할 때까지 기다린 다음 실행을 위해 대기열에서 작업을 꺼냅니다.
주요 기능은 다음과 같습니다:
스레드 재사용2.1. 아키텍처 설명
Executor 프레임워크란 무엇인가요?
이 내용은 Java Doc
제출된 Runnable 작업을 실행하는 개체입니다. 이 인터페이스는 스레드 사용, 예약 등에 대한 세부 정보를 포함하여 각 작업이 실행되는 방식에 대한 메커니즘에서 작업 제출을 분리하는 방법을 제공합니다. 일반적으로 Executor는 명시적으로 스레드를 생성하는 대신 사용됩니다.제출된 Runnable 작업을 실행하는 개체
. 이 인터페이스는 작업을 제출하는 메커니즘과 스레드 사용량, 예약 등에 대한 세부 정보를 포함하여 각 작업을 실행하는 방법을 제공합니다. 일반적으로 스레드를 명시적으로 생성하는 대신 실행자가 사용됩니다.Java의 스레드 풀은 Executor, Executors, ExecutorService 및 ThreadPoolExecutor 클래스를 사용하는 Executor 프레임워크를 통해 구현됩니다. 우리가 일반적으로 사용하는 인터페이스는 ExecutorService 하위 인터페이스
입니다.Executor는 스레드용 도구 클래스입니다(배열, 배열 및 수집 도구 클래스인 Collection과 유사한 도구 클래스). ThreadPoolExecutor는 이 클래스의 핵심입니다. 보조 도구 클래스 Executors를 통해 ThreadPoolExecutor 스레드 풀을 얻을 수 있습니다 각 클래스에 대한 자세한 소개는 다음과 같습니다.
Executor는 모든 스레드 풀 인터페이스에 대해 Runnable을 실행하는 방법을 정의하는 단 하나의 메서드만 가집니다. task
ExecutorService는 Executor의 동작을 추가하며 Executor 구현 클래스의 가장 직접적인 인터페이스입니다. 인터페이스 정의는 스레드 풀을 생성하기 위한 일련의 팩토리 메서드를 제공하는 Executor
Executors 스레드 풀 팩토리 클래스에 대한 서비스를 제공합니다. 반환된 스레드 풀이 구현되었습니다.
ScheduledExecutorService: 예약된 예약 인터페이스입니다. AbstractExecutorService 실행 프레임워크 추상 클래스.
ThreadPoolExecutor JDK의 특정 스레드 풀 구현입니다. 이 클래스를 기반으로 일반적으로 사용되는 다양한 스레드 풀이 구현됩니다
2.2 스레드 풀의 세 가지 주요 메서드
2.2.1.newFixedThreadPool(int) 메서드
Exectors.newFixedThreadPool(int) -->장기 작업 실행 성능이 좋습니다. 각 풀에는 N개의 고정 스레드와 고정된 수의 스레드가 있습니다
public static void main(String[] args) { //一池5个受理线程,类似一个银行5个受理窗口。不管你现在多少个线程,都只有5个 ExecutorService threadPool=Executors.newFixedThreadPool(5); try { //模拟有10个顾客过来银行办理业务,目前池子里面有5个工作人员提供服务。 for(int i=1;i{ System.out.println(Thread.currentThread().getName()+"\t 办理业务"); }); } } catch (Exception e) { // TODO: handle exception }finally{ threadPool.shutdown(); } }
실행 결과를 볼 수 있습니다. 풀에는 5개의 스레드가 있는데, 이는 외부 서비스를 제공하고 업무를 처리하는 직원 5명에 해당합니다. 사진에서 1번 창구는 업무를 두 번 처리하고, 은행 접수 창구는 여러 번 재사용이 가능합니다. 모든 사람이 반드시 두 번 처리하는 것은 아니지만 더 빨리 처리하는 사람이 더 많이 처리하게 됩니다.
스레드 실행 중에 400ms의 지연을 추가하면 효과를 볼 수 있습니다.
public static void main(String[] args) { //一池5个受理线程,类似一个银行5个受理窗口。不管你现在多少个线程,都只有5个 ExecutorService threadPool=Executors.newFixedThreadPool(5); try { //模拟有10个顾客过来银行办理业务,目前池子里面有5个工作人员提供服务。 for(int i=1;i{ System.out.println(Thread.currentThread().getName()+"\t 办理业务"); }); try { TimeUnit.MILLISECONDS.sleep(400); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } } catch (Exception e) { // TODO: handle exception }finally{ threadPool.shutdown(); } }
이는 네트워크가 혼잡하거나 비즈니스 처리 속도가 느릴 때 스레드 풀이 비즈니스 작업을 보다 균등하게 처리한다는 것을 보여줍니다.
Exectors.newSingleThreadExector()–> 하나의 작업, 하나의 풀, 하나의 스레드 실행
public static void main(String[] args) { //一池一个工作线程,类似一个银行有1个受理窗口 ExecutorService threadPool=Executors.newSingleThreadExecutor(); try { //模拟有10个顾客过来银行办理业务 for(int i=1;i{ System.out.println(Thread.currentThread().getName()+"\t 办理业务"); }); } } catch (Exception e) { // TODO: handle exception }finally{ threadPool.shutdown(); } }
Exectors.newCachedThread 풀 ()–> ;많은 단기 비동기 작업을 수행합니다. 스레드 풀은 필요에 따라 새 스레드를 생성하지만 이전에 빌드된 스레드가 사용 가능해지면 재사용합니다. 강하면 확장이 가능하고 강해집니다. n개의 스레드 풀, 확장 가능, 확장 가능, 캐시 의미
그러면 몇 개의 풀을 설정해야 합니까? 은행에 창이 하나뿐이라면 너무 많은 사람이 오면 너무 바빠질 것입니다. 은행에 창구는 많지만 오는 사람이 적다면 자원 낭비처럼 보일 것입니다. 그렇다면 합리적인 준비를 하는 방법은 무엇입니까? 이를 위해서는 확장 가능하고 확장 가능한 newCachedThreadPool() 메서드를 사용해야 합니다. 기본 매개 변수에는 LinkedBlocking 대기열 차단 대기열이 포함됩니다.
newSingleThreadExecutor 기본 소스 코드
public static void main(String[] args) { //一池一个工作线程,类似一个银行有n个受理窗口 ExecutorService threadPool=Executors.newCachedThreadPool(); try { //模拟有10个顾客过来银行办理业务 for(int i=1;i{ System.out.println(Thread.currentThread().getName()+"\t 办理业务"); }); } } catch (Exception e) { // TODO: handle exception }finally{ threadPool.shutdown(); } }
public static void main(String[] args) { //一池一个工作线程,类似一个银行有n个受理窗口 ExecutorService threadPool=Executors.newCachedThreadPool(); try { //模拟有10个顾客过来银行办理业务 for(int i=1;i{ System.out.println(Thread.currentThread().getName()+"\t 办理业务"); }); } } catch (Exception e) { // TODO: handle exception }finally{ threadPool.shutdown(); } }
실제로 이 세 가지 메서드가 공동으로 반환됩니다. 객체, 즉 ThreadPoolExecutor Object .
4. The seven important parameters of the thread poolThreadPoolExecutor's constructor
public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<runnable>()); }</runnable>
The above int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory,
RejectedExecutionHandler handler are our seven thread Parameters위는 7개의 매개변수를 갖는 ThreadPoolExecutor 클래스의 구성 방법입니다.
1) corePoolSize: 스레드 풀에 상주하는 코어 스레드 수, 코어 수라고 합니다.
예를 들어 스레드 풀을 은행 지점으로 간주할 수 있습니다. 은행이 열려 있는 동안에는 근무하는 사람이 최소한 한 명 이상 있어야 합니다. 이를 상주 코어 스레드 수라고 합니다. 예를 들어, 은행에 월요일부터 금요일까지 5개 지점이 모두 열려 있는 경우 월요일부터 금요일까지 상주 코어 스레드 수는 5입니다. 오늘 업무가 그다지 빈번하지 않고 창이 1인 경우 상주 코어 스레드 수는 5개입니다. today는 1입니다.2)maxImumPoolSize: 스레드 풀에서 동시에 실행할 수 있는 최대 스레드 수 이 값은 1
3)keepAliveTime: 초과 유휴 스레드의 생존 시간입니다. .현재 풀의 스레드 수가 corePoolSize를 초과하면 유휴 시간이 keepAliveTime에 도달하면 corePoolSize가 남을 때까지 초과 스레드가 소멸됩니다.
스레드 풀에 상주 스레드가 있고 최대 스레드 수가 있는 경우 이는 상주 스레드가 일반적으로 사용됨을 의미하며, 작업이 빡빡하면 확장됩니다. 최대 스레드 수에 도달하면 비즈니스가 중단되면 초과 유휴 스레드의 생존 시간을 30초로 설정합니다. 30대에 대한 초과 요청이 없으면 일부 은행에서는 창구를 닫으므로 확장뿐만 아니라 축소됩니다.
4)단위: keepAliveTime
단위: 초, 밀리초, 마이크로초.
5) workQueue: 작업 대기열, 제출되었지만 아직 실행되지 않은 작업
이것은 차단 대기열입니다. 예를 들어 은행에는 승인 창이 3개밖에 없고 4명의 고객이 왔습니다. 이 차단 대기열은 고객이 오면 은행을 떠날 수 없는 대기 공간입니다. 창 수는 동시 스레드 수를 제어합니다.6)threadFactory: 스레드 풀에서 작업자 스레드를 생성하는 스레드 팩토리를 나타냅니다. 스레드를 생성하는 데 사용됩니다. 일반적으로 기본값이면 충분합니다.
7) 핸들러: 거부 전략, 현재 대기열이 가득 차고 작업자 스레드가 스레드 풀의 최대 스레드 수(maximumPoolSize)보다 크거나 같을 때 실행 가능한 요청 실행 전략을 거부하는 방법을 나타냅니다.
예를 들어, 오늘은 은행의 고객 유입이 가장 많은 날입니다. 창구 3개가 모두 꽉 차 있고 대기실도 가득 찼습니다. 저희는 안전하지 않기 때문에 인원 모집을 계속하는 것을 선택하지 않았기 때문에 정중히 거절하는 것을 선택했습니다.
다음 섹션에서는 스레드 풀의 기본 작동 원리를 소개합니다
관련 학습 권장 사항: java 기본 사항
위 내용은 Java는 ThreadPool 스레드 풀을 설명합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!