java8 supplyasync_java – 为什么CompletableFuture.supplyAsync成功随...
我是Java 8中l(wèi)ambda和異步代碼的新手.我不斷得到一些奇怪的結(jié)果……
我有以下代碼:
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;
}
}
實(shí)際代碼要長(zhǎng)得多,因?yàn)閐oPost方法會(huì)將一些數(shù)據(jù)發(fā)布到Web服務(wù).但是,我能用這個(gè)簡(jiǎn)單的代碼復(fù)制我的問(wèn)題.
我想讓doPost方法執(zhí)行100次,但出于性能原因而異步(為了將數(shù)據(jù)推送到Web服務(wù)比執(zhí)行100次同步調(diào)用更快).
在上面的代碼中,’doPost’方法是隨機(jī)運(yùn)行的,但總是不超過(guò)20-25次.沒(méi)有例外.似乎某些線程處理機(jī)制默默地拒絕創(chuàng)建新線程并執(zhí)行它們的代碼,或者線程在沒(méi)有崩潰程序的情況下靜默崩潰.
我還有一個(gè)問(wèn)題,如果我向doPost方法添加比上面顯示的更多的功能,它會(huì)達(dá)到一個(gè)方法,該方法只是默默地破壞.在這種情況下,我嘗試在return語(yǔ)句之前添加一個(gè)System.out.println(“test”),但它永遠(yuǎn)不會(huì)被調(diào)用.循環(huán)100次的循環(huán)確實(shí)運(yùn)行了100次迭代.
至少可以說(shuō),這種行為令人困惑.
我錯(cuò)過(guò)了什么?為什么作為supplyAsync的參數(shù)提供的函數(shù)運(yùn)行看似隨機(jī)的次數(shù)?
編輯:只是想指出情況與問(wèn)題中的情況不完全相同,因?yàn)檫@個(gè)問(wèn)題涉及任意深度嵌套的期貨,而這一問(wèn)題涉及平行的問(wèn)題.然而,他們失敗的原因幾乎完全相同.這些案件看起來(lái)很明顯,值得向我提出不同的問(wèn)題,但其他人可能不同意……
總結(jié)
以上是生活随笔為你收集整理的java8 supplyasync_java – 为什么CompletableFuture.supplyAsync成功随...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 计算机软件无形资产机械工具,考前秘籍,无
- 下一篇: oracle oci.dll的作用,AS