如何使用Java中的锁启动两个内联线程?

时间:2011-12-16 12:57:18

标签: java multithreading

我有一个应用程序,它必须通过从远程数据库添加元数据来处理XML文件。由于我在Java中打开和解析它们,我认为线程可以提高性能(通过在我的应用程序等待来自DB的响应时处理文档)。

我们说我有两种方法:

HashMap result = getMetadata(String id);
Document doc = loadDocument(String path);

我想同时开始并等待两者完成。我可以内联吗?

此致 迈克尔

5 个答案:

答案 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.. 

不确定这是否是你需要的......