आप उन्हें चेनिंग तक पूरा करने के चरणों की निर्भरता मॉडल कर रहे हैं। आप दो कार्यों A
और B
एक अन्य कार्रवाई C
को श्रृंखला हैं, तो आप को परिभाषित रिश्तों A → C
और B → C
, लेकिन A
और B
और इसलिए बीच कोई रिश्ता नहीं है, वहाँ दूसरे शब्दों में कोई आदेश देने के संबंध, उन दोनों के बीच कोई रिश्ता नहीं सहित, है, आप कर सकते हैं 'टी भी, कि एक के बाद एक चलेंगे मान यानी
CompletableFuture<String> base=CompletableFuture.supplyAsync(() -> {
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(2));
return "source";
});
base.thenAccept(s -> {
System.out.println("entered first consumer in "+Thread.currentThread());
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(1));
System.out.println("leaving first consumer");
});
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(2));
base.thenAccept(s -> {
System.out.println("entered second consumer in "+Thread.currentThread());
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(1));
System.out.println("leaving second consumer");
});
entered first consumer in Thread[ForkJoinPool.commonPool-worker-1,5,main]
entered second consumer in Thread[main,5,main]
leaving second consumer
leaving first consumer
हालांकि तरह बहुत संभावना प्रिंट कुछ जाहिर है, इसके बारे में कोई गारंटी है होगा।
दो उपभोक्ताओं के बीच अपनी निर्भरता को लागू करने के लिए, आपको उन्हें उचित रूप से श्रृंखलाबद्ध करना होगा, उदा।
CompletableFuture<String> base=CompletableFuture.supplyAsync(() -> {
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(2));
return "source";
});
CompletableFuture<Void> next = base.thenAccept(s -> {
System.out.println("entered first consumer in "+Thread.currentThread());
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(1));
System.out.println("leaving first consumer");
});
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(2));
base.thenAcceptBoth(next, (s,ignored) -> {
System.out.println("entered second consumer in "+Thread.currentThread());
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(1));
System.out.println("leaving second consumer");
}).join();
इधर, दूसरा उपभोक्ता base
से परिणाम प्राप्त करने के लिए base
और next
, को श्रृंखलित है, लेकिन next
के पूरा होने पर निर्भर करती है (यदि वहाँ पास-शायद करने के लिए कोई परिणाम है आप सामान्य रूप से की आवश्यकता नहीं होगी जो यदि आपके पास ऐसा परिदृश्य है, तो आप अपने डिज़ाइन पर पुनर्विचार करना चाहते हैं)।
वैकल्पिक रूप से, आप एक Function
जो मूल्य से होकर गुजरता है करने के लिए पहली Consumer
परिवर्तित कर सकते हैं, तो आप thenApply
के माध्यम से यह श्रृंखला सकते हैं, यह करने के लिए एक और thenAccept
चरण चेनिंग अनुमति देने के लिए।
"तब स्वीकार करें" का अर्थ है कि पहले "यह" CompletableFuture पूरा हो गया है, और केवल तब पैरामीटर फ़ंक्शन निष्पादित किया गया है। –