Java 并行执行:只有在同步方法执行完成后,如何使用同步方法更新Excel工作簿?

Java 并行执行:只有在同步方法执行完成后,如何使用同步方法更新Excel工作簿?,java,multithreading,synchronization,Java,Multithreading,Synchronization,我在一个类中编写了一个非静态同步方法,以避免多个线程同时更新Excel工作簿。例如,ID为#9和#10的线程正在尝试更新Excel,预期线程#9应该完成同步方法的操作,然后线程#10应该能够调用我们没有调用的方法。下面是代码片段 public synchronized boolean put(String parameterName, String parameterValue) { try { System.out.println("Start Time:= " + T

我在一个类中编写了一个非静态同步方法,以避免多个线程同时更新Excel工作簿。例如,ID为#9和#10的线程正在尝试更新Excel,预期线程#9应该完成同步方法的操作,然后线程#10应该能够调用我们没有调用的方法。下面是代码片段

public synchronized boolean put(String parameterName, String parameterValue) {
    try {
        System.out.println("Start Time:= " + Thread.currentThread().getId() + " :: " + LocalDateTime.now().toString());
        updateData(data.get("XLFileName"), data.get("XLSheetName"), parameterName, parameterValue, data.get("TestCaseID"), data.get("Iteration"));
        System.out.println("End Time:= " + Thread.currentThread().getId() + " :: " + LocalDateTime.now().toString());
        return true;
    } catch (FilloException flex) {
        flex.printStackTrace();
        // extentTest.log(LogStatus.FATAL, "A", flex.getMessage());
        return false;
    }
}

public void updateData(String XLFileName, String XLSheet, String parameterName, String parameterValue, String testCaseID, String iteration) throws FilloException {
    Fillo fillo = new Fillo();
    Connection connection = fillo.getConnection(XLFileName);
    String strQuery = "Update " + XLSheet + " Set " + parameterName + "='" + parameterValue + "' where TestCaseID = '" + testCaseID + "' and Iteration = '" + iteration + "'";
    connection.executeUpdate(strQuery);
    connection.close();

    try {
        Thread.sleep(10000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}
电流输出: 开始时间:=10::2017-03-20T15:03:31.041 1行受影响 开始时间:=9::2017-03-20T15:03:31.619 1行受影响 结束时间:=10::2017-03-20T15:03:41.201 结束时间:=9::2017-03-20T15:03:41.675 预期产出: 开始时间:=10::2017-03-20T15:03:31.041 1行受影响 结束时间:=10::2017-03-20T15:03:41.201 开始时间:=9::2017-03-20T15:03:31.619 1行受影响 结束时间:=9::2017-03-20T15:03:41.675
也尝试使用同步块。

因为这不是静态的,所以这里使用的锁是一个,即每个对象一个锁。这意味着每个线程都有一个锁,因此每个线程都有权执行自己的
put
方法,因此您可以观察输出

为了获得所需的输出,我建议将此方法设置为静态,以便锁与类相关联,并且一次只有一个线程能够访问它,从而获得预期的输出(或者说,线程9可以比线程10更早启动):


您可以尝试使用锁定类的同步块,如下所示

public synchronized boolean put(String parameterName, String parameterValue) {
    synchronized (DataBook.class) {
        try {
            System.out.println("Start Time:= " + Thread.currentThread().getId() + " :: " + LocalDateTime.now().toString());
            updateData(data.get("XLFileName"), data.get("XLSheetName"), parameterName, parameterValue, data.get("TestCaseID"), data.get("Iteration"));
            System.out.println("End Time:= " + Thread.currentThread().getId() + " :: "  + LocalDateTime.now().toString());
            return true;

        } catch (FilloException flex) {
            flex.printStackTrace();
            return false;
        }
    }
}

嗨,我也面临同样的问题,所以我在网上浏览并登陆了这里。这里的数据本课程是什么?它是预定义类还是自定义类?这两种方法应该放在哪里?在主课上? Expected Output: Start Time:= 10 :: 2017-03-20T15:03:31.041 1 row(s) affected End Time:= 10 :: 2017-03-20T15:03:41.201 Start Time:= 9 :: 2017-03-20T15:03:31.619 1 row(s) affected End Time:= 9 :: 2017-03-20T15:03:41.675
public static synchronized boolean put(String parameterName, String parameterValue)
public synchronized boolean put(String parameterName, String parameterValue) {
    synchronized (DataBook.class) {
        try {
            System.out.println("Start Time:= " + Thread.currentThread().getId() + " :: " + LocalDateTime.now().toString());
            updateData(data.get("XLFileName"), data.get("XLSheetName"), parameterName, parameterValue, data.get("TestCaseID"), data.get("Iteration"));
            System.out.println("End Time:= " + Thread.currentThread().getId() + " :: "  + LocalDateTime.now().toString());
            return true;

        } catch (FilloException flex) {
            flex.printStackTrace();
            return false;
        }
    }
}