如何在Java中并发执行同一方法

时间:2018-11-30 11:56:48

标签: java multithreading concurrency

很抱歉,如果这是一个非常基本/愚蠢的问题。

我有一种方法,需要几分钟的时间才能运行。我想同时在多个对象上运行此方法。我想知道如何去做吗?即使只是指向正确文档的指针。我不确定是否应该使用线程,还是ExecuteService或其他。

这里是我想同时运行的方法。我要同时删除多个虚拟机。

private void deleteVm(String workspace, String vmName) {
    println("Delete VirtualMachine: " + vmName + " in Workspace " + workspace);
    Job job = executeDelete(getWorkbench().deleteVirtualMachine(sub(), workspace, vmName));
    println(job);

    subscribeToJobLogs(job);

    awaitUntilJobNotRunningOrNotFound(() -> executeCall(getWorkbench().getVirtualMachineDeleteJob(sub(), workspace, vmName)));
}

2 个答案:

答案 0 :(得分:1)

最简单的方法是使用CompletableFuture

CompletableFuture.runAsync(() -> deleteVm("one", "two"));
CompletableFuture.runAsync(() -> deleteVm("three", "four"));

答案 1 :(得分:1)

如果要同时使用调用方法,则需要线程。并发Java文档:https://docs.oracle.com/javase/tutorial/essential/concurrency/index.html

您有很多选择如何在Java中创建/使用线程。

1) 如果您知道需要多少个线程,可以像这样手动创建线程:

Thread thread1 = new Thread(()->deleteVm("a","b");
Thread thread2 = new Thread(()->deleteVm("c","d");

//START the threads
thread1.start();
thread2.start();

2) 您可以使用默认的线程池(通常是每个cpu核心的线程),如下所示:

CompletableFuture.runAsync(() -> deleteVm("a", "b"));
CompletableFuture.runAsync(() -> deleteVm("c", "d"));

3) 您可以像这样创建自己的线程执行器

ScheduledExecutorService executorService = Executors.nScheduledExecutorService executorService = Executors.newFixedThreadPool(5)

executorService.submit(() -> deleteVm("a", "b"));
executorService.submit(() -> deleteVm("c", "d"));