有几种方法可以实现你的任务在你试图同时运行的方法。当线程不应该同步时,你有安静的简单情况。
您可以使用ExecutorService
从Java并发:
public class ConcurrentCode {
private int countA = 0;
private int countB = 0;
int countA(){
for (int i = 0; i < 1000; i++) {
countA++;
}
System.out.println(countA);
return countA;
}
int countB(){
for (int i = 0; i < 1000; i++) {
countB++;
}
System.out.println(countB);
return countB;
}
public void execute(){
ExecutorService executorService = Executors.newFixedThreadPool(2);
// method reference introduced in Java 8
executorService.submit(this::countA);
executorService.submit(this::countB);
// close executorService
executorService.shutdown();
}
public static void main(String[] args){
new ConcurrentCode().execute();
}
}
记得关闭ExecutorService
否则你的应用程序不会停止,因为这将有活着的线程。
,也可以使用香草Java threads有最简单的方法:
public void executeInNativeThreads(){
// starts new thread and executes countA in it
new Thread(this::countA).start();
// starts new thread and executes countB in it
new Thread(this::countB).start();
}
为了让计算结果就可以得到Future<Integer>
从executorService
,然后你有一个选择:
- 调查
Future
如果完成
- 等到
Future
将完成。
- 等待明确对某些超时
下面是一个例子:
public void execute() throws Exception {
ExecutorService executorService = Executors.newFixedThreadPool(2);
Future<Integer> future1 = executorService.submit(this::countA);
Future<Integer> future2 = executorService.submit(this::countB);
// wait until result will be ready
Integer result1 = future1.get();
// wait only certain timeout otherwise throw an exception
Integer result2 = future2.get(1, TimeUnit.SECONDS);
System.out.println("result1 = " + result1);
System.out.println("result2 = " + result2);
executorService.shutdown();
}
注意,当我们明确地等待future1
结果,future2
仍然被另一个线程执行。这意味着在这个例子中,future2
的计算不会有很大的延迟。
另外,看看CompletionStage它用于异步计算。
什么阻止你这样做? – GhostCat
@OusmaneMahyDiaw因为这两种方法不会同时运行。 – Andreas
,因为它们在同一个对象的系统的不同部分中使用。此外,还有2种以上的方法,我不能只是一次性调用它们的方法。 –