急急急!!!求助,线程问题

问题描述

在做一个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.跳出循环条件。试试看(此分析只是个人研究你给出的代码的看法)

时间: 2024-08-03 09:56:40

急急急!!!求助,线程问题的相关文章

急急急求助

问题描述 我想开发一个利用环信的聊天app,求帮忙推荐下比较好的app开发公司吗?

visual studio-新人提问,急急急,vs 写网页遇到http error 403.14 forbidden 问题

问题描述 新人提问,急急急,vs 写网页遇到http error 403.14 forbidden 问题 我在做web的时候每次打开浏览器都出现这个内容,改了默认文档和目录浏览都不行,求大神帮助哇啊啊啊啊啊啊 HTTP Error 403.14 - Forbidden Web 服务器被配置为不列出此目录的内容. 最可能的原因: ?没有为请求的 URL 配置默认文档,并且没有在服务器上启用目录浏览. 可尝试的操作: ?如果不希望启用目录浏览,请确保配置了默认文档并且该文件存在. ? 启用目录浏览.

c++-急急急,C++ 与 C# 的转换问题。。。。。。。。。。。。

问题描述 急急急,C++ 与 C# 的转换问题............ C++ 中有一种函数的调用是把另一个函数名作为参数, 请问对应到C#中是怎么样做的呢? 例如 C++里有一个函数是这样的: int __stdcall RegisterFunctions(TRegisterFunction regf);//注册基本回调函数 TRegisterFunction 如下: typedef int (__stdcall * TRegisterFunction) (int SockID, char *

xstream解析问题-xstream将xml解析为bean,出差,急急急

问题描述 xstream将xml解析为bean,出差,急急急 这是我定义的两个用来接收的bean public class BulletinResponse { private String transId; private String processTime; private String cpId; private String curPage; private String pageCount; private String returnCode; private String cont

vb-求助求助,急急急 拜托拜托

问题描述 求助求助,急急急 拜托拜托 总是提示错误"438" 对象不支持该属性或方法 解决方案 Label4.print xxx -> label4.Caption = xxx 解决方案二: var aUsage = { ??"int":"^([+-]?)//d+$", ??"int+":"^([+]?)//d+$", ??"int-":"^-//d+$", ?

ndroid开发-新人求助,急急急。一个问题

问题描述 新人求助,急急急.一个问题 package com.example.welcome; import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.os.Bundle; import android.widget.But

wpf 线程-WPF UI线程问题 急急急急急急急急急急急

问题描述 WPF UI线程问题 急急急急急急急急急急急 已经调用UI线程更新操作位什么还出现这个问题啊? propertyManage1.Dispatcher.Invoke(new Action(delegate { propertyManage1.Children.Add(canvas); })); 调用线程无法访问此对象,因为另一个线程拥有该对象

mfc线程问题急急急急急

问题描述 mfc线程问题急急急急急 我想在MT4的脚本里调用vc++的库,并将一个窗体显示在当前的图表窗口中, 由于脚本执行与图表窗口运行在不同的线程中,导致报错,错误信息如下: 2015.03.26 14:49:34.890 Access violation read to 0xDDDDDF6D in 'C:UsersAdministratorAppDataRoamingMetaQuotesTerminalFF6486332E05B65B7E995E1DD5B90FBEMQL4Librarie

急急急! 线程调用对象报空指针

问题描述 急急急! 线程调用对象报空指针 先上代码.请看下面 package com.socket.client; import java.util.List; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import com.socket.model.

dev 汉化-DEV版本汉化的问题的求助,急急急

问题描述 DEV版本汉化的问题的求助,急急急 DEV13.1.4中大于等于的汉化 ,主要是XtraGrid.GridControl中自定义筛选列中大于,等于小于等的汉化 解决方案 http://download.csdn.net/download/gaowenqing133/8439609