클라이언트 요청을 처리 할 때 서버는 클라이언트는 종종 하나의 간단한의 과제에 직면하게된다. 각 작업에 대한 실행 스레드를 만드는 경우, 다음 작업은 클라이언트의 수천, 서버는 수만 개의 쓰레드를 생성합니다. 이것은 운영 체제 스레드 컨텍스트 시스템, 시스템 자원의 낭비의 부하를 증가 자주 전환 할 것입니다. 스레드 풀 기술은 미리 만들어진 스레드들에 의해이 문제를 해결합니다. 이 스레드는 스레드 생성과 파괴의 오버 헤드가 자주를 피하기 위해, 클라이언트가 제출 한 작업으로 처리합니다.
다음은 간단한 스레드 풀 인터페이스 정의입니다
public interface ThreadPool<Job extends Runnable> {
// 执行一个Job,这个Job需要实现Runnable
void execute(Job job);
void shutdown();
void addWorkers(int num);
void removeWorkers(int num);
int getJobSize();
}
클라이언트가 실행하여 스레드 풀에 작업을 제출할 수 있습니다. 스레드 풀 작업자 스레드 및 방법은 스레드를 닫 감소 / 증가를 제공한다. 여기서 작업자 스레드는 반복 작업을 나타내며 작업은 각 작업 스레드를 기다리는 작업 큐에 들어갑니다 클라이언트에 의해 제출했다.
package com.wang.chapter4.threadpool;
import java.util.*;
import java.util.concurrent.atomic.AtomicLong;
/**
* Created by 王忠珂 on 2016/11/23.
*/
public class DefaultThreadPool<Job extends Runnable> implements ThreadPool<Job> {
// 线程最大限制数
private static int maxWorkerNumber = 10;
// 线程池默认的数量
private static int defaultWorkerNumbers = 5;
// 线程池最小数量
private static int minWorkerNumbers = 1;
// 工作列表
private final LinkedList<Job> jobs = new LinkedList<Job>();
// 工作者列表
private final List<Worker> workers = Collections.synchronizedList(new ArrayList<Worker>());
// 工作者线程的数量
private int workerNum = defaultWorkerNumbers;
// 线程编号
private AtomicLong threadNum = new AtomicLong();
public DefaultThreadPool() {
initializeWorkers(defaultWorkerNumbers);
}
public DefaultThreadPool(int num) {
workerNum = num > maxWorkerNumber ? maxWorkerNumber :
num < minWorkerNumbers ? minWorkerNumbers : num;
initializeWorkers(workerNum);
}
public DefaultThreadPool(int defaultWorkerNumber, int maxWorkerNumber, int minWorkerNumber) {
this.maxWorkerNumber = maxWorkerNumber;
this.minWorkerNumbers = minWorkerNumber;
workerNum = defaultWorkerNumber > maxWorkerNumber ? maxWorkerNumber :
defaultWor 大专栏 java线程池技术kerNumber < minWorkerNumbers ? minWorkerNumbers : defaultWorkerNumber;
initializeWorkers(workerNum);
}
@Override
public void execute(Job job) {
if (job != null) {
synchronized (jobs) {
jobs.addLast(job);
jobs.notify();
}
}
}
@Override
public void shutdown() {
for (Worker worker: workers) {
worker.shutdown();
}
}
@Override
public void addWorkers(int num) {
synchronized (jobs) {
if (num + this.workerNum > maxWorkerNumber) {
num = maxWorkerNumber - this.workerNum;
}
initializeWorkers(num);
this.workerNum += num;
}
}
@Override
public void removeWorkers(int num) {
synchronized (jobs) {
if (num >= this.workerNum) {
throw new IllegalArgumentException("beyond workNum");
}
int count = 0;
while (count < num) {
Worker worker = workers.get(count);
if (workers.remove(worker)) {
worker.shutdown();
count ++;
}
}
this.workerNum -= count;
}
}
@Override
public int getJobSize() {
return jobs.size();
}
private void initializeWorkers (int num) {
for (int i=0; i<num; i++) {
Worker worker = new Worker();
workers.add(worker);
Thread thread = new Thread(worker, "ThreadPool-Worker-" + threadNum.incrementAndGet());
thread.start();
}
}
class Worker implements Runnable {
// 是否工作
private volatile boolean running = true;
public void run() {
while (running){
Job job = null;
synchronized (jobs) {
while (jobs.isEmpty()) {
try {
jobs.wait();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return;
}
}
// 取出一个Job
job = jobs.removeFirst();
}
if (job != null) {
try {
job.run();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
public void shutdown() {
running = false;
}
}
}