我有一个应用程序,它必须通过从远程数据库添加元数据来处理XML文件。由于我在Java中打开和解析它们,我认为线程可以提高性能(通过在我的应用程序等待来自DB的响应时处理文档)。
我们说我有两种方法:
HashMap result = getMetadata(String id);
Document doc = loadDocument(String path);
我想同时开始并等待两者完成。我可以内联吗?
此致 迈克尔
答案 0 :(得分:2)
我想同时开始并等待两者完成。我可以内联吗?
您可以启动两个主题并使用join()
等待它们完成。
如果要获取两个任务的结果,可以使用ExecutorService并为其提供Callable。稍后,您可以在完成当前线程时future.get()
结果。
答案 1 :(得分:1)
您可以轻松完成:
Thread t1 = new Thread(new Runnable() {
public void run() {
HashMap result = getMetadata(String id);
}
}
Thread t2 = new Thread(new Runnable() {
public void run() {
Document doc = loadDocument(String path);
}
}
t1.start();
t2.start();
t1.join();
t2.join();
答案 2 :(得分:1)
您可以使用java.util.concurrency.ExecutorService执行此操作。
请参阅以下示例:
ExecutorService executorService = Executors.newFixedThreadPool(2);
Future<HashMap> resultFuture = executorService.submit(new Callable<HashMap>() {
public HashMap call() throws Exception {
return getMetadata(id);
}
});
Future<Document> docFuture = executorService.submit(new Callable<Document>() {
public Document call() throws Exception {
return loadDocument(path);
}
});
try {
HashMap result = resultFuture.get();
Document doc = docFuture.get();
} catch (InterruptedException e) {
// handle
} catch (ExecutionException e) {
// handle
} finally {
executorService.shutdownNow();
}
答案 3 :(得分:0)
您可能希望查看一般的生产者 - 消费者类型解决方案。
答案 4 :(得分:0)
也许使用匿名的Runnable接口..如
Runnable runResult = new Runnable{
public void run{
//do stuff here related to getMetadata
}
Thread resultThread = new Thread(runResult);
resultThread.start();
}
Runnable runLoadDoc = new Runnable{
public void run{
//do stuff here related to loadDocument
}
Thread docThread = new Thread(runLoadDoc);
runLoadDoc.start();
}
//Logic for a join.. so that it will wait for both threads to complete..
不确定这是否是你需要的......