스레드 풀 란 무엇입니까?
스레드 풀은 하나 이상의 스레드에서 다중 응용 프로그램 로직을 [루프 실행]하는 스레드 모음입니다.
일반적으로 스레드 풀에는 다음 부분이 있습니다.
기본 작업을 완료하는 하나 이상의 스레드.
예약 관리에 사용되는 관리 스레드.
작업 대기열을 실행해야했습니다.
스레드 풀의 기능 :
스레드 풀의 기능은 시스템에서 실행 된 스레드 수를 제한하는 것입니다.
시스템 환경에 따라 스레드 수는 최상의 작업 효과를 달성하기 위해 자동 또는 수동으로 설정할 수 있습니다. 더 적은 시스템 리소스가 낭비되고 더 많은 시스템 정체가 높지 않습니다. 스레드 풀을 사용하여 스레드 수를 제어하고 다른 스레드가 줄을 서서 기다리고 있습니다. 작업이 실행 된 후 첫 번째 작업은 큐에서 가져와 실행을 시작합니다. 대기열에 대기 프로세스가 없으면 스레드 풀 의이 자원이 대기 중입니다. 새 작업을 실행 해야하는 경우 스레드 풀에 대기 작업자 스레드가 있으면 실행을 시작할 수 있습니다. 그렇지 않으면 대기 대기열에 들어갑니다.
스레드 풀을 직접 구현하십시오
스레드 풀에 대한 위의 이해를 바탕으로 우리는 간단한 스레드 풀을 작성합니다.
간단한 스레드 풀 인터페이스 :
public Interface ThreadPool <job는 runnable> {// 작업 (작업)을 실행합니다. // 스레드 풀을 닫습니다 무효 종료 (); // 작업자 스레드를 증가시킵니다. 즉, 작업 void AddWorkers (int num)를 실행하는 데 사용되는 스레드; // 작업자 스레드 감소 void removeWorker (int num); // 실행되기를 기다리는 작업 수를 가져옵니다 void getJobsize ();}클라이언트는 실행을위한 Execute (JOB) 방법을 통해 작업을 스레드 풀에 제출할 수 있으며, 클라이언트는 작업을 전혀 실행할 때까지 기다릴 필요가 없습니다. 실행 (작업) 메소드 외에도 스레드 풀 인터페이스는 작업자 스레드를 늘리기/감소시키는 방법을 제공하고 스레드 풀을 닫는 방법을 제공합니다. 각 클라이언트는 작업 대기열에 들어가고 작업자 스레드가 처리 될 때까지 기다리는 작업을 제출합니다.
스레드 풀 인터페이스의 기본 구현
공개 클래스 DefaultThreadpool <job runnable> 구현 threadPool <Hob> {// 스레드 풀 유지 보수 작업자 스레드의 최대 스레드 수 개인 정적 최종 최종 최종 int max_worker_numbers = 10; // 스레드 풀 유지 보수 작업자 스레드의 기본값 값 사유 정적 최종 int default_worker_numbers = 5; // 스레드 풀 유지 보수 작업자 스레드 개인 정적 최종 최종 최종 int min_worker_numbers = 1; // 클라이언트 개시 작업 개인 최종 LinkedList <Bob> Jobs = New LinkedList <BOB> ()를 추가하는 작업 목록을 유지합니다. // 작업자 스레드 목록 비공개 최종 목록 <Worker> Workers = Collections.SynchronizedList (New ArrayList <Worker> ()); // 작업자 스레드 수 개인 INT WorkerNum; // 개인 atomiclong streadnum 생성 = new atomiclong (); // 스레드 풀 생성 public defaultthreadpool () {this.workernum = default_worker_numbers; Initializeworkers (this.workernum); } public defaultthreadpool (int num) {if (num> max_worker_numbers) {this.workernum = default_worker_numbers; } else {this.workernum = num; } initializeworkers (this.workernum); } // 각 작업자 스레드를 초기화하여 개인 void initializeworkers (int num) {for (int i = 0; i <num; i ++) {Worker Worker = new Worker (); // 근로자 목록에 추가 스레드 workers.add (Worker); // 작업자 스레드 스레드 스레드 스레드 = 새 스레드 (작업자); thread.start (); }} public void execute (Job Job) {if (job! = null) {// 스레드의 "대기/알림 메커니즘"에 따라 작업 동기화 (jobs) {jobs.addlast (job); jobs.notify (); }}} // 각 작업자 스레드를 닫는 스레드 풀을 닫습니다. 공개 void shutdown () {for (Worker W : Workers) {w.shutdown (); }}} // 작업자 스레드 추가 공용 void AddWorkers (int num) {// 다음 스레드가 계속 증가하는 동안 스레드가 증가하거나 완료되는 것을 방지하기 위해 잠금 장치 추가로 작업자 스레드가 최대 값 동기화 된 (Jobs)를 초과하게합니다 (num + this. } initializeworkers (num); this.workernum += num; }} // 작업자 스레드 감소 공용 void removeWorker (int num) {synchronized (jobs) {if (num> = this.workernum) {throw new New OrgalArgumentException ( "기존 스레드 수를 초과"); } for (int i = 0; i <num; i ++) {Worker Worker = workers.get (i); if (worker! = null) {// 스레드를 닫고 worker.shutdown (); 근로자. }} this.workernum- = num; }} public int getJobsize () {// todo 자동 생성 메소드 스터브 리턴 작업자.size (); } // 작업자 스레드 클래스 정의 작업자는 실행 가능 {// 작업자 개인 휘발성 부울이 Running = true; public void run () {while (running) {job job = null; // 스레드 대기/알림 메커니즘 동기화 (jobs) {ifs.isempty ()) {try {jobs.wait (); // 스레드는 wakeup} catch (interpruptedException e) {// 스레드에서 외부 인터럽트 작업을 감지하고 스레드를 반환합니다 .CurrentThread (). 반품; }} // Job Job = jobs.removeFirst ()를 꺼냅니다. } // if (job! = null) {job.run (); }}} // 스레드 종료 public void shutdown () {running = false; }}}
스레드 풀의 구현에서 클라이언트가 execute (job) 메소드를 호출 할 때 작업 목록 작업에 작업을 지속적으로 추가하고 각 작업자 스레드는 작업에서 실행하기 위해 작업을 읽지 않습니다. 작업이 비어 있으면 작업자 실이 대기 상태로 들어갑니다.
작업을 추가 한 후 작업 대기열 작업에서 Notify () 메소드가 호출되어 작업자 스레드를 깨우십시오. 여기서는 대기 대기열의 모든 스레드를 차단 대기열로 옮겨 자원을 낭비하지 않기 위해 Notifyall ()을 호출하지 않습니다.
스레드 풀의 본질은 스레드 안전 작업 대기열을 사용하여 작업자 스레드 및 클라이언트 스레드를 연결하는 것입니다. 작업자 스레드는 작업 대기열에 작업을 한 후 클라이언트 스레드가 반환되며 작업자 스레드는 작업 대기열에서 작업을 엄청나게 가져와 실행합니다. 작업 대기열이 비어 있으면 작업자 스레드가 대기 상태로 들어갑니다. 클라이언트가 작업을 보낼 때 모든 작업자 스레드를 통과합니다. 많은 작업이 제출되면 더 많은 작업자 스레드가 깨어납니다.
참조 : "자바의 동시 프로그래밍 기술"Fang Tengfei