急!困扰了很久得问题!在多线程程序中各自独立线程的线程为什么会死锁?

czp14778981 2006-01-13 02:12:27
我的程序是多线程的,以前在windows下测试,当程序跑了一大半的时候,有几个线程都挂在那里了,程序也没死,可是线程就是不干了,将程序移到unix下,此问题没有出现,以为是windows系统的问题,可是最近在unix下跑程序也出现了此类问题,每次跑程序,总有几个线程挂在那里,什么也不干,这些线程都是各自独立的,没有联系,也没有通信。这些挂死的线程开始也干了一些活,后来不知道怎么就挂在那里,什么也不干,也不报错。那位高手帮帮忙,真的很急啊!
...全文
187 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
czp14778981 2006-01-16
  • 打赏
  • 举报
回复
问题已经解决,是由于程序捕获异常时用了getCause(),这个方法jdk1.3不支持,导致线程被挂死
yuzl32 2006-01-14
  • 打赏
  • 举报
回复
线程罢工了...
appleangle 2006-01-13
  • 打赏
  • 举报
回复
这个是因为你没有常规的关闭连接。。刚开始没有问题是因为你的访问量不大,数据库可以自己解决这个问题,但是当你长时间运行的时候,随着数据量的增大,自然会出现这样的问题
TinyJimmy 2006-01-13
  • 打赏
  • 举报
回复
应该是出现死锁了,使用到数据库时候容易出现。用一个数据库操作对象来操作数据库,然后同步使用这个对象
czp14778981 2006-01-13
  • 打赏
  • 举报
回复
同时写一个表数据库应该有表锁啊,可是数据库什么锁都没有
kingofhawks 2006-01-13
  • 打赏
  • 举报
回复
不知道你那个函数具体干什么的,检查一下有没有同时去写同一个表哦。
czp14778981 2006-01-13
  • 打赏
  • 举报
回复
还有一点比较奇怪,前一阵子这个程序都没有问题,就昨天出现的这个问题,为什么有时会有这个问题,有时又没有呢
leekooqi 2006-01-13
  • 打赏
  • 举报
回复
楼上的说,死锁的发生的可能是很小的,不是很确切,
你试试线程的地层访问不同步看看,问题将会出现一大堆。。。
czp14778981 2006-01-13
  • 打赏
  • 举报
回复
其实我这个线程就是在调用dorder.dealsingleorder()方法,这个方法就是从数据库中的一些表中取数据,然后插入或者变更到另外一些表里,很简单,不存在C方法调用D方法的问题,所以我觉得不是死锁
yczz 2006-01-13
  • 打赏
  • 举报
回复
线程死锁是由于两个线程须要共同的资源.举个例子:有两个线程A和B,和两个函数C和D.这两个函数很特别,C函数的执行需要调用D函数的资源,D函数的执行需要调用C函数的资源.当这两个线程同时执行的时候,可能在某一时刻两个线程同时执行,这时A线程调用C函数,C函数会占用自己的支援,同时他还要调用D函数的资源,可是这时B线程正在执行D函数,所以D的资源被B线程占用着,所以A线程无法进行而挂起等待B线程释放D的资源,同理C的资源被A线程占用着也处在挂起状态.这样两个线程都在等着对方释放资源,就会发生死锁.
死锁的发生的可能是很小的,但为了保证不发生死锁可以看看操作系统原理书籍,上面有很多办法.
czp14778981 2006-01-13
  • 打赏
  • 举报
回复
付上线程程序。被挂死的线程每次都能执行几次,然后就停在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)
{

}
}
czp14778981 2006-01-13
  • 打赏
  • 举报
回复
没有IO,也没有wait()/notify(),只有对数据库的操作,查过数据库,一切正常,没有死锁。
因为是各自独立的线程,没有必要加synchronized吧,加synchronized会不会影响程序速度啊?
xiaobzg 2006-01-13
  • 打赏
  • 举报
回复
将线程执行过程中调用的方法或对象加上synchronized属性
kingofhawks 2006-01-13
  • 打赏
  • 举报
回复
应该是阻塞了吧,你的线程是不是进行了一些IO,或者wait()/notify()等操作,还有看看有没有对资源争用导致死锁阿。

62,625

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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