日期:2014-05-20  浏览次数:20852 次

JAVA 线程池的队列最长时间
小弟有个不明白的地方请各位大虾指点指点。
在JAVA5开始可以使用java.util.concurrent包中的接口和类创建强大的多线程程序。
在设置的最大线程中。如果线程已满。则添加到workQueue队列中等待。
小弟想请教的问题就是。可否设置workQueue的排队时间。如果排队到了一定时间还不能执行则做相应的处理。

如下例子:
private static final int CORE_SIZE=2;
private static final int MAX_SIZE=2;
private static final long keepAliveTime=1;

ThreadPoolExecutor tpe=new ThreadPoolExecutor(
CORE_SIZE,
MAX_SIZE,
keepAliveTime,
TimeUnit.SECONDS,
workQueue,
rpeh
);

try {
ServerSocket serverSocket=new ServerSocket(8000);
while(true){
try {
//executorServer.execute(new SocketHandler(serverSocket.accept()));
//executorServer.su
tpe.execute(new SocketHandler(serverSocket.accept()));
} catch (IOException e) {e.printStackTrace();}
}
} catch (IOException e1) {e1.printStackTrace();}


其中 SocketHandler实现Runnable接口
在以上代码中。如果前两个请求8000端口则得以执行。第三个则放到队列中。第四个将拒绝。
然而如果第一、二的请求执行的时间非常的长。第三个请求将一直在队列中排队。
有什么方法可以让队列中的请求在排队到一定时间后做相应处理。比如提示用户“服务器繁忙请稍后再试。”之类的。


------解决方案--------------------
请看两个类:
ThreadPoolExecutor

LinkedBlockingQueue中的offer(E e, long timeout, TimeUnit unit) 方法