java8 supplyasync_java – 为什么CompletableFuture.supplyAsync成功随...
我是Java 8中lambda和異步代碼的新手.我不斷得到一些奇怪的結果……
我有以下代碼:
import java.util.concurrent.CompletableFuture;
public class Program {
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
String test = "Test_" + i;
final int a = i;
CompletableFuture cf = CompletableFuture.supplyAsync(() -> doPost(test));
cf.thenRun(() -> System.out.println(a)) ;
}
}
private static boolean doPost(String t) {
System.out.println(t);
return true;
}
}
實際代碼要長得多,因為doPost方法會將一些數據發布到Web服務.但是,我能用這個簡單的代碼復制我的問題.
我想讓doPost方法執行100次,但出于性能原因而異步(為了將數據推送到Web服務比執行100次同步調用更快).
在上面的代碼中,’doPost’方法是隨機運行的,但總是不超過20-25次.沒有例外.似乎某些線程處理機制默默地拒絕創建新線程并執行它們的代碼,或者線程在沒有崩潰程序的情況下靜默崩潰.
我還有一個問題,如果我向doPost方法添加比上面顯示的更多的功能,它會達到一個方法,該方法只是默默地破壞.在這種情況下,我嘗試在return語句之前添加一個System.out.println(“test”),但它永遠不會被調用.循環100次的循環確實運行了100次迭代.
至少可以說,這種行為令人困惑.
我錯過了什么?為什么作為supplyAsync的參數提供的函數運行看似隨機的次數?
編輯:只是想指出情況與問題中的情況不完全相同,因為這個問題涉及任意深度嵌套的期貨,而這一問題涉及平行的問題.然而,他們失敗的原因幾乎完全相同.這些案件看起來很明顯,值得向我提出不同的問題,但其他人可能不同意……
總結
以上是生活随笔為你收集整理的java8 supplyasync_java – 为什么CompletableFuture.supplyAsync成功随...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机软件无形资产机械工具,考前秘籍,无
- 下一篇: oracle oci.dll的作用,AS