Java处理http协议相关初步(三)――线程池的使用分析 (二)

2014-11-24 07:45:52 · 作者: · 浏览: 2
,现在清楚了
while (true)
;
}

}
package com.test.myjava;

import java.util.Queue;
import java.util.concurrent.*;

public class ThreadPoolTest {
private static int requestNum = 0;
public ThreadPoolExecutor threadPoolExecutor;

public static void main(String[] args) {
ThreadPoolTest tt = new ThreadPoolTest();
int corePoolSize = 2;
int maximumPoolSize = 5;
long keepAliveTime = 30;
int queueSize = 1;//5可以试一下
int queueNum = 0;
tt.threadPoolExecutor = new ThreadPoolExecutor(corePoolSize,maximumPoolSize,
keepAliveTime,TimeUnit.SECONDS,
new ArrayBlockingQueue(queueSize),
new ThreadPoolExecutor.CallerRunsPolicy() );
//tt.threadPoolExecutor =(ThreadPoolExecutor) Executors.newFixedThreadPool(maximumPoolSize);
for(int i=0;i<5;i++ ){
System.out.println("Create Thread Num:"+i);
tt.threadPoolExecutor.execute(new RequestTasks(requestNum++));
queueNum = tt.getQueueSize(tt.threadPoolExecutor.getQueue());
if(queueNum!=0){
System.out.println("queueNum:"+queueNum);
}
}
}

private synchronized int getQueueSize(Queue queue) {
return queue.size();
}
}

// 处理请求的任务
class RequestTasks implements Runnable {

static int processedNum = 0;
int reqNum = 0;
RequestTasks(int reqNum){
this.reqNum = reqNum;
}

public void run() {
// TODO Auto-generated method stub
synchronized(this){//这里其实没用O(∩_∩)O~
processedNum++;
}
System.out.println("ProcessedNum:" + processedNum);
System.out.println("reqestNum"+reqNum);
//“ 去掉注释,看看只能响应两个,有些问题”这是上篇里说到的,
//自己也不懂原因,确实是不明白该怎样使用,现在清楚了
while (true)
;
}

}
如果直接运行的话,会发现当任务数达到corePoolSize规定的之后,新提交的任务就得不到执行,也是上篇说的新的请求得不到运行,可是任务队列也没有满,这是什么原因的:查看了实现的源码之后才知道,ThreadPoolExecutor的execute方法中(针对例子中使用的那个构造函数),当线程数达到corePoolSize时,新任务入队,但是只有当队伍满时或者旧有的线程运行完后才会处理队列中的任务。好了,说到这里。因此不是有特别要求还是用Executors来创建比较好。最后想说,有源码看还是很不错的,容易发现问题的所在。


摘自 w7849516230的专栏