NutzCN Logo
问答 关于线池程的需求疑问,希望各位大神给我技术方向建议
发布于 3216天前 作者 qq_6427b776 2027 次浏览 复制 上一个帖子 下一个帖子
标签:

各位大神好,兽兽哥好:
我将具体的需求说一下:
一个外系统通过webservice的接口服务,请求接口,每请求一次,就执行里面的任务(具体的任务,目前已经解决)。关键我遇到的问题是:
因为要支持多并发的请求服务,所以需要用到线程池,我的想法是:限制线程池的线程数量(例如限制为10个),意思就是说最大同时执行10个任务,第11个请求就需要排队等待,所以接口服务需要返回{一个请求过多,请稍候的出参信息}。然后对于线程池的代码设计,我应该如何去弄?如何做到资源调度合理,不会发生内存溢出之类的?
注明:执行任务需要的时长是很久的,有可能是几分钟,有可能是几个小时都有可能。(毕竟任务的具体内容,是调用网络扫描工具去扫描网段,获取整个网段的信息)
请各位大神给我指导,谢谢。
que1_png

7 回复

你可以把每次的请求放到一个队列中
然后启动一个线程来执行队列中的数据
如果队列中的数据长度大于你的要求值 你就提示队列已满

@Rekoe 可以提供一下伪代码吗?

```
protected final BlockingQueue queue = new LinkedBlockingQueue();
public void start(){
Thread t = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
MessageObject msg = queue.take();
//TODO 处理message
} catch (InterruptedException ex) {
log.errorf(ex.getMessage());
}
}
}
}, getClass().getName());
t.start();
}
public void addMessage(MessageObject message )
{
if(queue.size >=10){
return
}
queue.add(message);
}

@qq_6427b776

protected final BlockingQueue queue = new LinkedBlockingQueue();
public void start(){
Thread t = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
MessageObject msg = queue.take();
//TODO 处理message
} catch (InterruptedException ex) {
log.errorf(ex.getMessage());
}
}
}
}, getClass().getName());
t.start();
}
public void addMessage(MessageObject message )
{
if(queue.size >=10){
return
}
queue.add(message);
}

@qq_6427b776
其实你用消息队列就能保证你的消极不会丢

用不着这么复杂吧,把你的webservice交给容器管理就好了啊,比如tomcat
你专心写你的逻辑就行,tomcat配置一下线程参数就可以了

@qq_2b6bbb2b 我是用jetty服务,你说的容器如何配置?

添加回复
请先登陆
回到顶部