工作中系统总是挂掉。查看JConsole,原来是在Thread.sleep那里的问题,请大家帮忙看看,是怎么回事?怎么解决?多线程 通信
解决方案 »
- 高分急求java字符串分解方法
- struts2 一个奇怪异常
- 为什么呢
- ajax+struts谁有这个例子
- jboss: javax.naming.NameNotFoundException
- org.xml.sax.SAXParseException: Invalid byte 3 of 3-byte UTF-8 sequence
- webservice 复杂参数传递的问题!
- 开发 ejb大家用什么工具呀
- 请问用axis2的webservice怎么加密啊
- 为什么java 输出语句要用 prinln 而不像C语言一样用printf呢
- Struts2上传文件问题,真的着急求解!在线等!
- Hessian框架支持的最大客户端线程数
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,然后自己再往下继续。思路是这样的。也就是上面37行的地方出问题。大家帮我看看这代码写的有问题吗?我现在不知道该怎么实现这两个线程通信,就是下面需要 changeLockInfo时,上面的run可以暂停下,等好了上面再执行。可以用wait和notify吗?