【发布时间】:2016-12-23 19:05:12
【问题描述】:
我有一个 REST Web 服务通过套接字调用从遗留系统获取结果来处理它的请求。
由于有 4 个可用的套接字,我设置了一个没有 4 个线程的 Executorservice 来排队等待此类连接。该服务最初运行正常,但一段时间后性能开始下降;我使用 jconsole 发现它正在创建 > 3000 个线程,最后以以下错误结束:
SEVERE: Servlet.service() for servlet [jersey-serlvet] in context with
path [/DCardServices] threw exception [java.lang.OutOfMemoryError:
unable to create new native thread] with root cause
java.lang.OutOfMemoryError: unable to create new native thread
问题:
- 为什么会创建这么多线程?
- 在这种情况下我必须关闭 Executorservice 吗?我在 Web 服务环境中的情况如何。
以下是我的代码的 sn-p。
ExecutorService spool = Executors.newFixedThreadPool(Integer.valueOf(GlobalUtils.getAppProp().getString("socketPoolSize")).intValue());
ExecutorService executorService = Executors.newFixedThreadPool(4);
public Response queforTdmProcess(JSSigData jsData) {
return sndWSResponse(jsData.processCardResp1(executorService.submit(new TdmSocketRequest(jsData,socketQueue, spool)).get()));
}
public class TdmSocketRequest implements Callable<String> {
Socket s = getSocketFromPool();
/* connection to socket and get data */
retSocketToPool(s);
}
public Socket getSocketFromPool() {
try {
conSocketConsumer sckconsumer = new conSocketConsumer(getSocketQueue());
Future<Socket> future = getSpool().submit(sckconsumer);
Socket s = future.get();
System.out.print("Getting socket " + s.getLocalPort() + " from the pool" + "\n");
return s;
} catch (Exception e) {
// TODO: handle exception
}
return null;
}
public void retSocketToPool(Socket s) {
conSocketProducer sckProducer = new conSocketProducer(getSocketQueue(),s);
System.out.print("Returning socket " + s.getLocalPort() + " to the pool" + "\n" );
getSpool().submit(sckProducer);
}
}
非常感谢任何建议和帮助!
【问题讨论】:
-
请改进您问题中的代码格式
标签: java multithreading executorservice