求助!为何Thread.sleep会有问题

yeyingwulh 2013-06-01 11:01:06
工作中系统总是挂掉。查看JConsole,原来是在Thread.sleep那里的问题,请大家帮忙看看,是怎么回事?怎么解决?

...全文
326 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
yeyingwulh 2013-06-02
  • 打赏
  • 举报
回复
呵呵,系统没有异常信息。就是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吗?
无聊找乐 2013-06-02
  • 打赏
  • 举报
回复
或者贴下系统挂掉时的异常信息
无聊找乐 2013-06-02
  • 打赏
  • 举报
回复
你这能开出问题就不是人了 把代码贴出来吧.

67,515

社区成员

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

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