有幾種方法可以實現你的任務在你試圖同時運行的方法。當線程不應該同步時,你有安靜的簡單情況。
您可以使用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種以上的方法,我不能只是一次性調用它們的方法。 –