5

को अवरुद्ध कर सकता है कुछ ब्लॉगों में उल्लिखित (उदा। I can't emphasize this enough: thenAccept()/thenRun() methods do not block) CompletableFuture.thenAccept वास्तव में ब्लॉक कर सकते हैं। निम्नलिखित कोड पर विचार करें, uncommenting pause विधि कॉल thenAccept ब्लॉक करने के लिए कारण होगा:CompletableFuture.thenAccept वास्तव में

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> { 
    log.trace("return 42"); 
    return "42"; 
}); 

//pause(1000); //uncommenting this will cause blocking of thenAccept 

future.thenAccept((dbl -> { 
    log.trace("blocking"); 
    pause(500); 
    log.debug("Result: " + dbl); 
})); 

log.trace("end"); 
pause(1000); 

हम यह सुनिश्चित करें कि निम्नलिखित ब्लॉक नहीं हो सकता है? यह मेरी समझ है कि अगर supplyAsync तुरंत चलाता है तो thenAccept अवरुद्ध कर सकता है, नहीं?

CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> { 
    return "42"; 
}).thenAccept((dbl -> { 
    pause(500); 
    log.debug("Result: " + dbl); 
})); 

उत्तर

6

आप ठीक कह रहे हैं, अगर भविष्य पहले से ही पूरा हो गया है thenAccept() रोकेंगे। यह भी ध्यान रखें कि जब यह मामला नहीं है, तो यह थ्रेड का कारण बन जाएगा जो इसे पूरा होने के समय ब्लॉक करने के लिए पूरा करता है।

यही कारण है कि आप thenAcceptAsync() है, जो एक गैर-अवरुद्ध तरीके से अपने Consumer चलेंगे:

CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> { 
    return "42"; 
}).thenAcceptAsync((dbl -> { 
    pause(500); 
    log.debug("Result: " + dbl); 
})); 

भी देखें Which executor is used when composing Java CompletableFutures?

संबंधित मुद्दे