java 服务器 线程池_JAVA实现一个低性能的WEB服务器(一)——线程池

packagecom.equator.eagle.threadpool;importlombok.extern.slf4j.Slf4j;importjava.util.LinkedList;importjava.util.List;importjava.util.concurrent.ThreadLocalRandom;importjava.util.concurrent.atomic.AtomicInteger;/*** @Author: Equator

* @Date: 2019/12/4 20:39

**/@Slf4jpublic class DefaultThreadPool implements EagleThreadPool{//线程池工作者数目

private static final int maxWorkerNumber = 16;private static final int defaultWorkerNumber = 4;private static final int minWorkerNumber = 1;//工作者编号(线程名)

private AtomicInteger workerId = newAtomicInteger();//工作者队列

private final List workerList = new LinkedList<>();//工作任务队列

private final List jobList = new LinkedList<>();//是否接受新的任务

private volatile boolean isWorking = true;//工作者内部类

class Worker implementsRunnable {private volatile boolean isRunning = true;private volatile boolean isHandling = false;

@Overridepublic voidrun() {while(isRunning) {

Job job= null;synchronized(jobList) {while (isRunning &&jobList.isEmpty()) {try{//超时等待

jobList.wait(1000);

}catch(InterruptedException e) {

Thread.currentThread().interrupt();return;

}

}//取一个任务,这里需要判断一下任务队列是否为空,否则会发生NPE(空指针异常)

if (jobList.size() > 0) {

job= jobList.remove(0);

}

}if (job != null) {try{

isHandling= true;

job.run();

}catch(Exception e) {

}finally{

isHandling= false;

}

}

}

}public voidclose() {this.isRunning = false;

}

}publicDefaultThreadPool() {

initWorkers(defaultWorkerNumber);

}public DefaultThreadPool(intinitialWorkerNumber) {

initWorkers(initialWorkerNumber);

}public int initWorkers(intnum) {int freeCapacity = maxWorkerNumber -workerList.size();if (num >=freeCapacity) {

num=freeCapacity;

}if (num

num=minWorkerNumber;

}for (int i = 0; i < num; i++) {

Worker worker= newWorker();

workerList.add(worker);

Thread thread= new Thread(worker, "Worker-" +workerId.incrementAndGet());

thread.start();

}returnnum;

}

@Overridepublic voidexecute(Job job) {if (isWorking && job != null) {synchronized(jobList) {

jobList.add(job);

jobList.notify();

}

}else{

log.debug("thread pool is waiting to close or job is null");

}

}

@Overridepublic intgetJobSize() {returnjobList.size();

}

@Overridepublic int addWorkers(intnum) {synchronized(jobList) {returninitWorkers(num);

}

}

@Overridepublic int removeWorkers(intnum) {int count = 0;synchronized(jobList) {for (int i = 0; i < num; i++) {

Worker worker=workerList.get(i);if (!worker.isHandling) {

worker.close();

count++;

}

}

}returncount;

}

@Overridepublic voidshutdown() {

isWorking= false;while (!jobList.isEmpty()) {

log.debug("sorry, jobList is not null, jobList size :{}, waiting to close", jobList.size());

}for(Worker worker : workerList) {

worker.close();

}

}public static voidmain(String[] args) {

DefaultThreadPool defaultThreadPool= newDefaultThreadPool();int count = 1000;while (count > 0) {int finalCount =count;

defaultThreadPool.execute(newRunnable() {

@Overridepublic voidrun() {int flag = 10;while (flag > 0) {

log.debug("job{} say {}", finalCount, flag);

flag--;

}

log.debug("job{} done", finalCount);

}

});if (count == 500) {

defaultThreadPool.shutdown();

}

count--;

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值