请各位大侠帮我看看下面的线程有没有问题?谢谢

007james 2005-12-12 10:50:06
1,线程如下:

import java.sql.Connection;
import java.sql.PreparedStatement;
import org.apache.log4j.*;
import com.customs.util.Log4jExceptionUtil;
import java.sql.SQLException;
import com.customs.util.DBHelper;


/**
* function: 本线程功能:根据formNo把已经完成的job复制到finished_process_job表中去
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2005</p>
*/
class CopyFinishedJobThread extends Thread {
private Logger log = Logger.getLogger(this.getClass().getName());
String formNo = "";
boolean flag = false;
Connection threadConn = null;
public CopyFinishedJobThread() {
}

/**
* 唤醒线程
* @param flag boolean
* @param formNo String:表单编号
*/
synchronized void wakeUp(boolean flag, String formNo) {
this.flag = flag;
this.formNo = formNo;
notify();
}

/**
* function:根据formNo把已经完成的job复制到finished_process_job表中去,
* 并删除job中拥有当前formNo的记录
* @param pConn Connection
* @param formNo String
* @throws SQLException
*/
public void copyFinishedJob(Connection pConn,String formNo) throws SQLException{
PreparedStatement ps = null;
String sql = "";
try {
sql = " insert into [finished_process_job] "
+ " select * from job where form_no = ? ";
ps = pConn.prepareStatement(sql);
int i = 1;
ps.setString(i++, formNo);
ps.executeUpdate();

deleteByFormNo(pConn,formNo);//根据formNo删除job
}
catch (SQLException ex) {
Log4jExceptionUtil.logStackTrace(ex, log);
throw new SQLException();
}
finally {
if (ps != null) {
try {
ps.close();
}
catch (SQLException ex) {
Log4jExceptionUtil.logStackTrace(ex, log);
}
}
}

}


/**
* function:根据formNo删除工作(流程任务)的相关信息
* @param pConn Connection
* @param formNo String
* @exception SQLException
*/
public void deleteByFormNo(Connection pConn,String formNo) throws SQLException{
PreparedStatement ps = null;
String sql = null;
try {
sql = "delete from [job] where form_no = ?";
ps = pConn.prepareStatement(sql);
ps.setString(1, formNo);
ps.executeUpdate();
}
catch (SQLException se) {
Log4jExceptionUtil.logStackTrace(se, log);
throw new SQLException();
}
finally {
if (ps != null) {
try {
ps.close();
}
catch (SQLException ex) {
Log4jExceptionUtil.logStackTrace(ex, log);
}
}
}
}

public void run() {
while (true) {
synchronized (this) {
if (!flag) {
try {
wait(1000); //休眠1秒
}
catch (InterruptedException ex) {
Log4jExceptionUtil.logStackTrace(ex, log);
}
}
}
if (flag) {
try {

DBHelper helper = new DBHelper();
threadConn = helper.getConnection();
threadConn.setAutoCommit(false);
log.info("Current Thread Name=" + this.getName());
//根据formNo把已经完成的job复制到finished_process_job表中去,
//并删除job中拥有当前formNo的记录
copyFinishedJob(threadConn, formNo);
threadConn.commit();
flag = false;
}
catch (Exception ex) {
try{
threadConn.rollback();
}
catch (Exception ex1){
Log4jExceptionUtil.logStackTrace(ex1, log);
}
Log4jExceptionUtil.logStackTrace(ex, log);
}
finally {
try {
if (threadConn != null) {
threadConn.close();
threadConn = null;
}
}
catch (SQLException ex) {
Log4jExceptionUtil.logStackTrace(ex, log);
}
log.info(this.getName() + " Connection is null ? : "
+ (threadConn == null));
flag = false;
}
}
}
}
}

2,调用如下:
//调用线程,
//根据formNo把已经完成的或者是被注销的job复制到finished_process_job表中去,
//并删除job中拥有当前formNo的记录
CopyFinishedJobThread thread = new CopyFinishedJobThread();
thread.start();
thread.wakeUp(true,formNo);
...全文
292 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
rex0y 2005-12-13
  • 打赏
  • 举报
回复
就你这种情况

while 没必要 wakeup没必要
直接在run里写数据库操作就行了

调用的话直接new一个线程,然后start就算了
也就是说只需要写run和你所要做的数据库操作


coolarmy 2005-12-13
  • 打赏
  • 举报
回复
建议用信号量机制(Semaphore)激活处理线程的方式做,你这样做不到完全同步,因为你是用自己内部变量flag来控制处理的开始,
007james 2005-12-12
  • 打赏
  • 举报
回复
没人帮我?高手呢?
yuzl32 2005-12-12
  • 打赏
  • 举报
回复
好长呀
----- 再转
kingofhawks 2005-12-12
  • 打赏
  • 举报
回复
好长呀
-------转贴.
007james 2005-12-12
  • 打赏
  • 举报
回复
rex0y,你好,我其实只要是想写一个线程,让一个程序满足一个条件就去调用这个线程,这个线程主要的目的是把job的数据copy到另外一个表finished_job,然后删除掉job的数据.麻烦帮我看看是否有合理,非常感谢!
skycncomp 2005-12-12
  • 打赏
  • 举报
回复
我晕啊
treeroot 2005-12-12
  • 打赏
  • 举报
回复
好长呀
rex0y 2005-12-12
  • 打赏
  • 举报
回复
看不懂你写的什么意思
你这个虽然用了线程技术,但是只有一个线程
没有分成几个线程

而且还有个wakeUp不知道写的做什么用的
还有这个,在里面用synchronized (this) 这个是啥意思

while (true) 也没必要,既然是处理数据,数据处理完了,函数自然就返回了
你这不是搞个死循环

62,624

社区成员

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

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