工作中系统总是挂掉。查看JConsole,原来是在Thread.sleep那里的问题,请大家帮忙看看,是怎么回事?怎么解决?多线程 通信

解决方案 »

  1.   

    呵呵,系统没有异常信息。就是login页面打不开。代码是这样的(我模拟了原来的代码,简写了一下)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,然后自己再往下继续。思路是这样的。也就是上面37行的地方出问题。大家帮我看看这代码写的有问题吗?我现在不知道该怎么实现这两个线程通信,就是下面需要 changeLockInfo时,上面的run可以暂停下,等好了上面再执行。可以用wait和notify吗?