在java5中已经实现了线程池,现在处理大量并发时,不用再自己写线程池来做了,java5中有现成的东西来用。
但是我有点问题不知道怎么处理,希望知道的朋友给我指点一下:
以下是java文档中给出的实例:
用法示例
class NetworkService {
private final ServerSocket serverSocket;
private final ExecutorService pool; public NetworkService(int port, int poolSize) throws IOException {
serverSocket = new ServerSocket(port);
pool = Executors.newFixedThreadPool(poolSize);
}
public void serve() {
try {
for (;;) {
pool.execute(new Handler(serverSocket.accept()));
}
} catch (IOException ex) {
pool.shutdown();
}
}
} class Handler implements Runnable {
private final Socket socket;
Handler(Socket socket) { this.socket = socket; }
public void run() {
// read and service request
}
}
------------------------------------------
我的问题是:我创建了具有5个工作线程的池(poolSize=5),当有5个以上并发请求时,第5个请求以后的所有被排在队列中,等待空闲线程;如果前面工作的5个线程永远完不成自己的任务,那么第5个以后的请求就永远排在后面,得不到执行。假设class Handler的run方法是这样的(我是说假设,如果前5个线程在工作中由于其他原因阻塞了,基本上就跟下面一样了)
public void run() {
while(true) {
//do something
}
}
那就像我说的,由于池中的5个线程都处于正常活动状态,线程池又不会自动把这些线程结束,其它请求就永远得不到执行;我想避免这种情况,该如何做??比如我想维护一个工作线程进行一项任务的最大时间,如果某个线程超出了这个时间,我就把它的任务结束掉,以便于新的任务别执行,我该怎么做?
但是我有点问题不知道怎么处理,希望知道的朋友给我指点一下:
以下是java文档中给出的实例:
用法示例
class NetworkService {
private final ServerSocket serverSocket;
private final ExecutorService pool; public NetworkService(int port, int poolSize) throws IOException {
serverSocket = new ServerSocket(port);
pool = Executors.newFixedThreadPool(poolSize);
}
public void serve() {
try {
for (;;) {
pool.execute(new Handler(serverSocket.accept()));
}
} catch (IOException ex) {
pool.shutdown();
}
}
} class Handler implements Runnable {
private final Socket socket;
Handler(Socket socket) { this.socket = socket; }
public void run() {
// read and service request
}
}
------------------------------------------
我的问题是:我创建了具有5个工作线程的池(poolSize=5),当有5个以上并发请求时,第5个请求以后的所有被排在队列中,等待空闲线程;如果前面工作的5个线程永远完不成自己的任务,那么第5个以后的请求就永远排在后面,得不到执行。假设class Handler的run方法是这样的(我是说假设,如果前5个线程在工作中由于其他原因阻塞了,基本上就跟下面一样了)
public void run() {
while(true) {
//do something
}
}
那就像我说的,由于池中的5个线程都处于正常活动状态,线程池又不会自动把这些线程结束,其它请求就永远得不到执行;我想避免这种情况,该如何做??比如我想维护一个工作线程进行一项任务的最大时间,如果某个线程超出了这个时间,我就把它的任务结束掉,以便于新的任务别执行,我该怎么做?
楼主【xjluogang】截止到2008-07-07 15:06:31的历史汇总数据(不包括此帖):
发帖的总数量:9 发帖的总分数:330
结贴的总数量:5 结贴的总分数:280
无满意结贴数:1 无满意结贴分:20
未结的帖子数:4 未结的总分数:50
结贴的百分比:55.56 % 结分的百分比:84.85 %
无满意结贴率:20.00 % 无满意结分率:7.14 %
楼主加油
你可以选择其他的静态方法啊~~
newCachedThreadPool()
newScheduledThreadPool()