cx944179519 2015-04-09 02:02 采纳率: 0%
浏览 4109

Java socket通信 使用jconsole监控发现线程数不断增加

Java socket 使用线程通信,作为接收方每接收一个交易信息,使用jsonsole监控线程发现线程数量增加22个左右,经生产环境运行结果,当已启动线程总数达到2600多时 tomcat出现类似于假死的状况,不再接收任何交易信息。目前正在使用系统定时任务每天定时重启(每日交易量在70-80左右),求大手帮我分析下,现在附上图片和部分代码。jsonsole监控图:图片说明部分代码;public class SimpleServer {
​ ​public static ServerSocket serverSocket;//服务端Socket
​ ​private Socket clientSocket;//客户端Socket
​ ​private int port;//端口
​ ​public static ThreadPoolExecutor producerPool;//线程池
​ ​private Logger logger=Logger.getLogger(SimpleServer.class);
​ ​public SimpleServer(int port){
​ ​ ​this.port=port;
​ ​ ​try {
​ ​ ​ ​ ​ ​serverSocket=new ServerSocket(port);
​ ​ ​ ​ ​ ​logger.info(TimeHelper.getTime("yyyy-MM-dd-HH-mm-ss")+"本系统监听公积金中心服 ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​务 ​启动......\n开始监听端口:"+port);
​ ​ ​} catch (IOException e) {
​ ​ ​ ​ ​logger.error(e.getMessage());
​ ​ ​}
​ ​}
public void startServer() {
​​ //初始化线程池
​ ​ try {

​ ​ ​ producerPool= new ThreadPoolExecutor(20, 50, 1,
​ ​ ​ ​ ​ ​ TimeUnit.SECONDS, new ArrayBlockingQueue(30),
​ ​ ​ ​ ​ ​ new ThreadPoolExecutor.DiscardOldestPolicy());

​ ​ }catch (Exception e) {logger.error(e.getMessage());​​ }
​ //开始监听端口
​ while(true){
​ ​ try {
​ ​ ​ ​ clientSocket=serverSocket.accept();
​ ​ ​ producerPool.execute(new ThreadPoolTask(clientSocket));//
​ ​ } catch (IOException e) {

​ ​ ​ logger.error(e.getMessage());
​ ​ }
​ }
​ }
}

  • 写回答

2条回答 默认 最新

  • 清水依恋成 2015-04-09 02:17
    关注

    很纳闷,首先你的开发模式,tomcat本身已经是被动接收请求的server了,你在tomcat里又启动一个ServerSocket,应该用main函数单独进程启动,和你这么说,tomcat上的servlet是按照线程初始化,一次servlet交易就是一个线程。

    评论

报告相同问题?

悬赏问题

  • ¥15 求解 yolo算法问题
  • ¥15 虚拟机打包apk出现错误
  • ¥30 最小化遗憾贪心算法上界
  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 逻辑谓词和消解原理的运用
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。