JAVA线程池
package com.thread;
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.thread;
import com.sun.tools.javac.comp.Annotate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.atomic.AtomicLong;
import com.thread.ThreadPool;
public class DefaultThreadPool<Job extends Runnable> implements ThreadPool<Job>{
private static final int MAX_WORKER_NUMBER = 10;
private static final int DEFAULT_WORKDER_NUMBER = 5;
//线程池最小的数量
private static final int MIN_WORKER_NUMBER = 1;
private final LinkedList<Job> jobs = new LinkedList<Job>();
private final List<Worker> workers = Collections.synchronizedList(new ArrayList<Worker>());
private int workerNum = 5;
private AtomicLong threadNum = new AtomicLong();
public DefaultThreadPool() {
initWorkers(DEFAULT_WORKDER_NUMBER);
}
public DefaultThreadPool(int num){
workerNum = num > MAX_WORKER_NUMBER?MAX_WORKER_NUMBER:num < MIN_WORKER_NUMBER?MIN_WORKER_NUMBER:num;
initWorkers(workerNum);
}
@Override
public void execute(Job job) {
if (job == null) {
throw new NullPointerException();
}
synchronized (jobs) {
jobs.addLast(job);
jobs.notify();
}
}
@Override
public void addWorkers(int num) {
synchronized (jobs) {
if(num+this.workerNum>MAX_WORKER_NUMBER)
num = MAX_WORKER_NUMBER - workerNum;
initWorkers(num);
workerNum+=num;
}
}
@Override
public void shutdown() {
for (int i = 0; i < workers.size(); i++) {
Worker worker = workers.get(i);
worker.shutdown();
}
}
@Override
public void removeWorkers(int num) {
synchronized (jobs) {
if(num>=workerNum)
throw new IllegalArgumentException("beyond worknum");
//按照给定的数量关闭worker
int count = 0;
while(count<num){
Worker worker = workers.get(count);
if(workers.remove(worker)){
worker.shutdown();
count++;
}
}
this.workerNum-=num;
}
}
@Override
public int getJobSize() {
return this.workerNum;
}
//初始化线程工作者
private void initWorkers(int num){
for (int i = 0; i < num; i++) {
Worker worker = new Worker();
workers.add(worker);
Thread thread = new Thread(worker, "ThreadPool-Worker-"+threadNum.getAndIncrement());
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 ex) {
Thread.currentThread().interrupt();
return;
}
}
job = jobs.removeFirst();
}
if (job != null) {
try {
job.run();
} catch (Exception ex) {
}
}
}
}
public void shutdown() {
running = false;
}
}
}
package com.thread;
public class ThisTest {
public static void main(String[] args) {
ThreadPool<Runnable> pool = new DefaultThreadPool<>(2);
for (int i = 0; i < 100; i++) {
pool.execute(new countThread());
}
}
static class countThread implements Runnable{
private static volatile Integer count = 0;
private static Object object = new Object();
@Override
public void run() {
synchronized(object){
count++;
System.out.println(Thread.currentThread().getName() + " " + count);
}
}
}
}
posted on 2016-06-04 10:58 walkwalkwalk 阅读(163) 评论(0) 收藏 举报
浙公网安备 33010602011771号