如何使同步方法异步运行

时间:2014-11-05 21:05:14

标签: java multithreading asynchronous

我有一个Java方法,在设置数据库中的必需字段后,进行Web服务调用。但是这个方法是同步的,当我们运行一个在不同的case id上调用这个方法的批处理(大约10000多个案例)时,它需要超过一天。我不知道为什么这是同步的,所以如何让这个方法调用异步?

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

}

3 个答案:

答案 0 :(得分:2)

您可以将您的Web服务调用包装在Callable个对象中,并通过适当的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 ...
    }
}

答案 1 :(得分:1)

执行ExecutorService

中的代码
ExecutorService es = Executors.newSingleThreadExecutor();
Future<?> f = es.submit(new Runnable(){
    @Override
    public void run() {
        sendNotice(caseKey, communicationId);
    }
});

您获得表示任务未完成的Future<?>

答案 2 :(得分:-1)

如果无法更改代码,则无法使方法异步运行。 克服这个问题的唯一方法是从多个JVM运行测试用例。