求助!多线程通信问题(tomcat达到最大线程数后,服务不响应)

yeyingwulh 2013-05-31 12:36:09
工作中遇到了问题(别人写的代码,我负责解bug),如下:
tomcat启动后会启动所有的后台线程ATread,并维护一个threadMap缓存(key,new ATread())
public class ATread extends Thread{
private boolean needToSleep = false;//是否需要sleep
private boolean isThreadSleeping = false;//是否在sleep
public boolean runFlag = false;
private String ip = "";

public ATread(String ip){
this.ip = ip;
}
public void run(){
try {
runFlag = true;
while(runFlag) {
doXXX(); //使用当前ip进行操作
//用于修改ip时的等待控制
while(needToSleep){
isThreadSleeping=true;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}finally{
//释放资源
}
}

public synchronized boolean changeLockInfo() {
boolean result = false;
this.needToSleep = true;//设置需要暂停
if(runFlag){
while( !isThreadSleeping ){
try {
//本意是让当前线程暂停,然后上面的run方法可以进入while循环并sleep,那么此线程可以继续往下执行
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return doXXX();//其他操作
}
}
}

public class BClass{
//修改Ip操作
public static boolean changeIp() {
boolean result = false;
//threadMap用来存放所有的线程,可以根据key值得到对应的AThread
AThread athread = threadMap.get(Key);
result = athread.changeLockInfo();
return result;
}
}

业务需求是这样的:AThread使用当前Ip一直不停的进行某些操作。当有客户端申请需要修改ip时,访问BClass.changeIp(),先从threadMap取出此Ip所对应的AThread,再调用同步方法changeLockInfo()修改ip。changeLockInfo()先让自己暂停,让上面的run()进入sleep,然后自己再往下继续。思路是这样的。

问题是:工程启动后,打开JConsole监控线程,发现阻塞在了上面37行Thread.sleep那里。于是后面就积累了
很多线程阻塞住了,导致超过tomcat的最大线程数,最后系统当掉,login页面都打不开。
我是个新手,请大家帮忙看看,是什么问题?有什么解决方案??我知道这代码写的有问题,但我不知道怎么改?

我觉得这代码首先,在执行37行时,sleep是不会释放对象锁的,所以上面的run没法运行的。那换个角度,本来就是要让run不执行啊,所以33-41行完全可以去掉啊!上面run里的while也不要了
...全文
634 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yeyingwulh 2013-06-19
  • 打赏
  • 举报
回复
结贴了,问题是发生了死锁
yeyingwulh 2013-06-01
  • 打赏
  • 举报
回复
恩,现在问题是这段代码有没有问题?因为系统挂掉后,查看JConsole,是上面37行Thread.sleep那里有问题,导致线程积累。我现在不知道该怎么实现这两个线程通信,就是下面需要 changeLockInfo时,上面的run可以暂停下,等好了上面再执行。可以用wait和notify吗?
yeyingwulh 2013-06-01
  • 打赏
  • 举报
回复
没有人知道吗?自己顶一下
fei1710 2013-06-01
  • 打赏
  • 举报
回复
楼主没搞懂线程对象跟线程的关系,所以不太明白楼主的意思。
yeyingwulh 2013-05-31
  • 打赏
  • 举报
回复
刚刚写了个小例子跑了下,发现对象锁貌似只对调用chang方法的线程起作用。上面的run方法依然可以继续运行,因为它没加synchronized

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧