Java 如何使同步方法异步运行

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

我在Java中有一个方法,在从数据库中设置所需字段后,进行web服务调用。然而,这个方法是同步的,当我们在10000多个案例的不同案例id上运行一个批处理调用这个方法时,需要一天以上的时间。我不知道为什么这是同步的,那么我如何才能使这个方法调用异步运行呢

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