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);

解决方案 »

  1.   

    看不懂你写的什么意思
    你这个虽然用了线程技术,但是只有一个线程
    没有分成几个线程而且还有个wakeUp不知道写的做什么用的
    还有这个,在里面用synchronized (this) 这个是啥意思while (true) 也没必要,既然是处理数据,数据处理完了,函数自然就返回了
    你这不是搞个死循环
      

  2.   

    rex0y,你好,我其实只要是想写一个线程,让一个程序满足一个条件就去调用这个线程,这个线程主要的目的是把job的数据copy到另外一个表finished_job,然后删除掉job的数据.麻烦帮我看看是否有合理,非常感谢!
      

  3.   

    就你这种情况while 没必要 wakeup没必要
    直接在run里写数据库操作就行了调用的话直接new一个线程,然后start就算了
    也就是说只需要写run和你所要做的数据库操作
      

  4.   

    建议用信号量机制(Semaphore)激活处理线程的方式做,你这样做不到完全同步,因为你是用自己内部变量flag来控制处理的开始,