我的程序是多线程的,以前在windows下测试,当程序跑了一大半的时候,有几个线程都挂在那里了,程序也没死,可是线程就是不干了,将程序移到unix下,此问题没有出现,以为是windows系统的问题,可是最近在unix下跑程序也出现了此类问题,每次跑程序,总有几个线程挂在那里,什么也不干,这些线程都是各自独立的,没有联系,也没有通信。这些挂死的线程开始也干了一些活,后来不知道怎么就挂在那里,什么也不干,也不报错。那位高手帮帮忙,真的很急啊!
调试欢乐多
因为是各自独立的线程,没有必要加synchronized吧,加synchronized会不会影响程序速度啊?
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)
{ }
}
死锁的发生的可能是很小的,但为了保证不发生死锁可以看看操作系统原理书籍,上面有很多办法.