问题描述
在做一个socket服务端,不停的接收处理客户端的数据。publicvoidrun(){try{InputStreamis=socket.getInputStream();finalBufferedReaderreader=newBufferedReader(newInputStreamReader(is));intintReceiveCount=0;while(true){SimpleDateFormatsdf=newSimpleDateFormat("HH:mm:ss");System.out.println(sdf.format(newDate()));if(!socket.isClosed()){try{finalStringstrRead=reader.readLine();System.out.println(strRead);JSONObjectjsonObject=newJSONObject(strRead);//listTemp.add(strRead);System.out.println("---0");pools.execute(newRunnable(){@Overridepublicvoidrun(){System.out.println("---1");processData(socket,strRead);}});]
循环接收数据,然后开启一个线程处理数据。但是,每次都是一开始的时候很正常,运行一段时间以后,就只接收数据,线程不执行了。把客户端关掉以后,线程爆发一样全部开始执行了。也不报异常。我用的是自定义的线程池,是什么原因啊?求帮帮忙,急死了,谢谢啊!!
解决方案
本帖最后由 sinat_25338313 于 2015-01-15 09:35:47 编辑
解决方案二:
processData(socket,strRead);这个方法结束了没有。贴出来看看。还有你说的自定义线程池是自己写的?还是JAVA自带的那个。
解决方案三:
引用1楼a12939026的回复:
processData(socket,strRead);这个方法结束了没有。贴出来看看。还有你说的自定义线程池是自己写的?还是JAVA自带的那个。
privatevoidprocessData(Socketsocket,Stringstr){try{//System.out.println("--2");//StringstrReceive=str;if(str!=null){if(!str.contains("heart")){if(getDeviceIdAndType(str,socket)==1){//开始解析数据//System.out.println("--3");ProcessThreadph=newProcessThread();ph.run(str);}}}}catch(Exceptione){e.printStackTrace();Thread.interrupted();errorLog.error("截取数据异常"+e.toString());}}
里边的是数据库操作,我有跟踪,正常的时候是都处理完了。就是运行一段时间以后,处理数据线程就不再执行了。
解决方案四:
引用1楼a12939026的回复:
processData(socket,strRead);这个方法结束了没有。贴出来看看。还有你说的自定义线程池是自己写的?还是JAVA自带的那个。
privateThreadPoolExecutorpools=newThreadPoolExecutor(20,1000,20000,TimeUnit.MILLISECONDS,newArrayBlockingQueue<Runnable>(1000),newThreadPoolExecutor.DiscardPolicy());
这是线程池
解决方案五:
首先这个线程池写的不咋地啊,最大线程数量和队列长度的1000都太大了,你这个线城池应该绝大部分时间都是20个线程在运行,不管有多少个请求,不信你看看。另外,你这个连接时候长连接吗?如果是长连接的话,超过20个客户端,你这个线程池基本都阻塞了。你可以把那两个1000先调小看看newThreadPoolExecutor(20,60,20000,TimeUnit.MILLISECONDS,newArrayBlockingQueue<Runnable>(10),newThreadPoolExecutor.DiscardPolicy());
解决方案六:
另外做socket的服务端,尤其是长连接的,做好用nio,框架就是mina和netty都挺好使的,楼主可以试试
解决方案七:
引用4楼lsongiu86的回复:
首先这个线程池写的不咋地啊,最大线程数量和队列长度的1000都太大了,你这个线城池应该绝大部分时间都是20个线程在运行,不管有多少个请求,不信你看看。另外,你这个连接时候长连接吗?如果是长连接的话,超过20个客户端,你这个线程池基本都阻塞了。你可以把那两个1000先调小看看newThreadPoolExecutor(20,60,20000,TimeUnit.MILLISECONDS,newArrayBlockingQueue<Runnable>(10),newThreadPoolExecutor.DiscardPolicy());
我是个新手,刚开始工作。为什么长连接超过20个客户端就阻塞了呢?能解释一下吗,谢谢~~
解决方案八:
引用6楼sinat_25338313的回复:
Quote: 引用4楼lsongiu86的回复:
首先这个线程池写的不咋地啊,最大线程数量和队列长度的1000都太大了,你这个线城池应该绝大部分时间都是20个线程在运行,不管有多少个请求,不信你看看。另外,你这个连接时候长连接吗?如果是长连接的话,超过20个客户端,你这个线程池基本都阻塞了。你可以把那两个1000先调小看看newThreadPoolExecutor(20,60,20000,TimeUnit.MILLISECONDS,newArrayBlockingQueue<Runnable>(10),newThreadPoolExecutor.DiscardPolicy());我是个新手,刚开始工作。为什么长连接超过20个客户端就阻塞了呢?能解释一下吗,谢谢~~
java中的socket的读是带阻塞的,如果没有东西可读又没有关闭连接的话,线程就卡在读这里了
解决方案九:
分析一下希望对你有帮助不管你用什么池(线程池,链接池)都记住要关闭流或者关闭链接,开始你写了一个while(true)这里是一个死循环没有跳出的条件,所以不停的接受数据,直至线程池满复核。所以通过你给出的代码给两点意见吧。1.关流;2.跳出循环条件。试试看(此分析只是个人研究你给出的代码的看法)