Java 如何使同步方法异步运行
我在Java中有一个方法,在从数据库中设置所需字段后,进行web服务调用。然而,这个方法是同步的,当我们在10000多个案例的不同案例id上运行一个批处理调用这个方法时,需要一天以上的时间。我不知道为什么这是同步的,那么我如何才能使这个方法调用异步运行呢Java 如何使同步方法异步运行,java,multithreading,asynchronous,Java,Multithreading,Asynchronous,我在Java中有一个方法,在从数据库中设置所需字段后,进行web服务调用。然而,这个方法是同步的,当我们在10000多个案例的不同案例id上运行一个批处理调用这个方法时,需要一天以上的时间。我不知道为什么这是同步的,那么我如何才能使这个方法调用异步运行呢 public synchronized void sendNotice(CaseKey caseKey, Long communicationId) { // calling data from database // setting pa
public synchronized void sendNotice(CaseKey caseKey, Long communicationId) {
// calling data from database
// setting parameters for webserice
// make a webservice call
// this code will be called 470 times
}
您可以将web服务调用包装在可调用对象中,并通过适当的ExecutorService执行它们。它可能看起来像这样:
public class WSResult {
public int getResultProp1() {
...
}
}
public class WSCall implements Callable<WSResult> {
public WSCall(int param1, String param2) {
...
}
public WSResult call() {
// perform WS call
return new WSResult(...);
}
}
public class SomeClass {
// ...
public void driver() {
ExecutorService service = Executors.newFixedThreadPool(WS_CAPACITY);
List<Future<WSResult>> results = new ArrayList<>();
for (int i = 0; i < 10000; i += 1) {
results.add(service.submit(new WSCall(... parameters ...)));
}
service.shutdown();
service.awaitTermination();
// ... do something with the results ...
}
}
如果无法更改代码,则无法使该方法异步运行。 克服这一问题的唯一方法是从多个JVM运行测试用例 以以下方式执行代码:
您将获得一个表示任务即将完成的未来。将第5行的数字更改为“4”,您就可以了!如果你没有显示代码,我们怎么可能说你的代码呢?没有代码,谁知道呢。唯一明显的答案是使它异步而不是同步。它在客户机上的VMware中。我不能粘贴它。示例应该有帮助。。。
ExecutorService es = Executors.newSingleThreadExecutor();
Future<?> f = es.submit(new Runnable(){
@Override
public void run() {
sendNotice(caseKey, communicationId);
}
});