Java 并行执行:只有在同步方法执行完成后,如何使用同步方法更新Excel工作簿?
我在一个类中编写了一个非静态同步方法,以避免多个线程同时更新Excel工作簿。例如,ID为#9和#10的线程正在尝试更新Excel,预期线程#9应该完成同步方法的操作,然后线程#10应该能够调用我们没有调用的方法。下面是代码片段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
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;
}
}
}