我的程序是多线程的,以前在windows下测试,当程序跑了一大半的时候,有几个线程都挂在那里了,程序也没死,可是线程就是不干了,将程序移到unix下,此问题没有出现,以为是windows系统的问题,可是最近在unix下跑程序也出现了此类问题,每次跑程序,总有几个线程挂在那里,什么也不干,这些线程都是各自独立的,没有联系,也没有通信。这些挂死的线程开始也干了一些活,后来不知道怎么就挂在那里,什么也不干,也不报错。那位高手帮帮忙,真的很急啊!

解决方案 »

  1.   

    应该是阻塞了吧,你的线程是不是进行了一些IO,或者wait()/notify()等操作,还有看看有没有对资源争用导致死锁阿。
      

  2.   

    将线程执行过程中调用的方法或对象加上synchronized属性
      

  3.   

    没有IO,也没有wait()/notify(),只有对数据库的操作,查过数据库,一切正常,没有死锁。
    因为是各自独立的线程,没有必要加synchronized吧,加synchronized会不会影响程序速度啊?
      

  4.   

    付上线程程序。被挂死的线程每次都能执行几次,然后就停在for循环那个地方不动了
    public  void run()
      {
        Connection conn=null;
        Statement stmt=null;
        ResultSet res=null;   try{
         DoOrder dorder=new DoOrder();
         //conn=this.getconn();
         conn=dorder.getconn();
         conn.setAutoCommit(false);     stmt=conn.createStatement();System.out.println("11111111111111111111111111111");
          Vector apply_vec=new Vector();
          res=stmt.executeQuery("select distinct apply_id,up_number,tm_apply from ibs_order_base_info where apply_status=0  and THREAD_ID="+process_num+" order by tm_apply");
          while (res.next()) {
            apply_vec.add(res.getString("apply_id"));
            apply_vec.add(res.getString("up_number"));
          }
          System.out.println("2222222222222222222222222222");
          if(res!=null) res.close();
          if(stmt!=null) stmt.close();
         System.out.println(to8859(threadname+"["+threadnum+"]受理单数量:") + apply_vec.size()/2);     for (int i=0;i<apply_vec.size();i+=2) {
                 System.out.println("3333333333");
            String apply_id=apply_vec.get(i).toString();
            disapply_id=apply_id;
            dorder.dealsingleorder(conn,apply_id,apply_vec.get(i+1).toString());
            System.out.println("************************************************************");
            System.out.println("*                   apply_id: "+apply_id+"              *");
            System.out.println("************************************************************");
            conn.commit();
                       System.out.println("44444444444");
           // conn.rollback();
          }
         //受理单正确工单、退单工单进历史表
         end=true;   }catch (Exception e) {
         try
         {
           conn.rollback();
           e.printStackTrace();
           throw new Exception("程序异常:"+e.getMessage());
         }
         catch(Exception e1)
         {     }   }finally{
         try
         {
           if(res!=null)
             res.close();
           if (stmt != null)
             stmt.close();
           if (conn != null)
             conn.close();
         }
         catch(Exception e)
         {     }
       }
      

  5.   

    线程死锁是由于两个线程须要共同的资源.举个例子:有两个线程A和B,和两个函数C和D.这两个函数很特别,C函数的执行需要调用D函数的资源,D函数的执行需要调用C函数的资源.当这两个线程同时执行的时候,可能在某一时刻两个线程同时执行,这时A线程调用C函数,C函数会占用自己的支援,同时他还要调用D函数的资源,可是这时B线程正在执行D函数,所以D的资源被B线程占用着,所以A线程无法进行而挂起等待B线程释放D的资源,同理C的资源被A线程占用着也处在挂起状态.这样两个线程都在等着对方释放资源,就会发生死锁.
    死锁的发生的可能是很小的,但为了保证不发生死锁可以看看操作系统原理书籍,上面有很多办法.
      

  6.   

    其实我这个线程就是在调用dorder.dealsingleorder()方法,这个方法就是从数据库中的一些表中取数据,然后插入或者变更到另外一些表里,很简单,不存在C方法调用D方法的问题,所以我觉得不是死锁
      

  7.   

    问题已经解决,是由于程序捕获异常时用了getCause(),这个方法jdk1.3不支持,导致线程被挂死