-
-
Notifications
You must be signed in to change notification settings - Fork 26.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added hndi translation for async-method-invocation, balking, bridge, …
…builder and buisness-delegate pattern
- Loading branch information
1 parent
60f9e4a
commit 2e9576a
Showing
5 changed files
with
837 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,170 @@ | ||
--- | ||
title: Async Method Invocation | ||
category: Concurrency | ||
language: hi | ||
tag: | ||
- Reactive | ||
--- | ||
|
||
## हेतु | ||
|
||
एसिंक्रोनस विधि मंगलाचरण एक पैटर्न है जहां कॉलिंग थ्रेड होता है | ||
कार्यों के परिणाम की प्रतीक्षा करते समय अवरुद्ध नहीं किया जाता है। पैटर्न समानांतर प्रदान करता है | ||
अनेक स्वतंत्र कार्यों को संसाधित करना और इनके माध्यम से परिणाम प्राप्त करना | ||
कॉलबैक या सब कुछ पूरा होने तक प्रतीक्षा करना। | ||
|
||
## व्याख्या | ||
|
||
वास्तविक दुनिया का उदाहरण | ||
|
||
>अंतरिक्ष रॉकेट लॉन्च करना एक रोमांचक व्यवसाय है। मिशन कमांड लॉन्च करने का आदेश देता है और | ||
> कुछ अनिश्चित समय के बाद, रॉकेट या तो सफलतापूर्वक लॉन्च होता है या बुरी तरह विफल हो जाता है। | ||
साफ़ शब्दों में | ||
|
||
> एसिंक्रोनस विधि मंगलाचरण कार्य प्रसंस्करण शुरू करता है और कार्य पूरा होने से तुरंत पहले वापस आ जाता है | ||
> तैयार. कार्य प्रसंस्करण के परिणाम बाद में कॉल करने वाले को लौटा दिए जाते हैं। | ||
विकिपीडिया कहता है | ||
|
||
> मल्टीथ्रेडेड कंप्यूटर प्रोग्रामिंग में, एसिंक्रोनस मेथड इनवोकेशन (एएमआई) के रूप में भी जाना जाता है | ||
> एसिंक्रोनस विधि कॉल या एसिंक्रोनस पैटर्न एक डिज़ाइन पैटर्न है जिसमें कॉल साइट | ||
> कॉल किए गए कोड के समाप्त होने की प्रतीक्षा करते समय अवरुद्ध नहीं होता है। इसके बजाय, कॉलिंग थ्रेड है | ||
> उत्तर आने पर सूचित किया जाएगा। उत्तर के लिए मतदान एक अवांछित विकल्प है। | ||
**प्रोग्रामेटिक उदाहरण** | ||
|
||
इस उदाहरण में, हम अंतरिक्ष रॉकेट लॉन्च कर रहे हैं और चंद्र रोवर्स तैनात कर रहे हैं। | ||
|
||
एप्लिकेशन एसिंक विधि मंगलाचरण पैटर्न प्रदर्शित करता है। पैटर्न के प्रमुख भाग हैं | ||
`AsyncResult` जो अतुल्यकालिक रूप से मूल्यांकन किए गए मान के लिए एक मध्यवर्ती कंटेनर है, | ||
`AsyncCallback` जिसे कार्य पूरा होने पर निष्पादित करने के लिए प्रदान किया जा सकता है और `AsyncExecutor` | ||
async कार्यों के निष्पादन का प्रबंधन करता है। | ||
|
||
```java | ||
public interface AsyncResult<T> { | ||
boolean isCompleted(); | ||
T getValue() throws ExecutionException; | ||
void await() throws InterruptedException; | ||
} | ||
``` | ||
|
||
```java | ||
public interface AsyncCallback<T> { | ||
void onComplete(T value, Optional<Exception> ex); | ||
} | ||
``` | ||
|
||
```java | ||
public interface AsyncExecutor { | ||
<T> AsyncResult<T> startProcess(Callable<T> task); | ||
<T> AsyncResult<T> startProcess(Callable<T> task, AsyncCallback<T> callback); | ||
<T> T endProcess(AsyncResult<T> asyncResult) throws ExecutionException, InterruptedException; | ||
} | ||
``` | ||
|
||
`ThreadAsyncExecutor` is an implementation of `AsyncExecutor`. Some of its key parts are highlighted | ||
next. | ||
|
||
```java | ||
public class ThreadAsyncExecutor implements AsyncExecutor { | ||
|
||
@Override | ||
public <T> AsyncResult<T> startProcess(Callable<T> task) { | ||
return startProcess(task, null); | ||
} | ||
|
||
@Override | ||
public <T> AsyncResult<T> startProcess(Callable<T> task, AsyncCallback<T> callback) { | ||
var result = new CompletableResult<>(callback); | ||
new Thread( | ||
() -> { | ||
try { | ||
result.setValue(task.call()); | ||
} catch (Exception ex) { | ||
result.setException(ex); | ||
} | ||
}, | ||
"executor-" + idx.incrementAndGet()) | ||
.start(); | ||
return result; | ||
} | ||
|
||
@Override | ||
public <T> T endProcess(AsyncResult<T> asyncResult) | ||
throws ExecutionException, InterruptedException { | ||
if (!asyncResult.isCompleted()) { | ||
asyncResult.await(); | ||
} | ||
return asyncResult.getValue(); | ||
} | ||
} | ||
``` | ||
|
||
फिर हम यह देखने के लिए कुछ रॉकेट लॉन्च करने के लिए तैयार हैं कि सब कुछ एक साथ कैसे काम करता है। | ||
|
||
```java | ||
public static void main(String[] args) throws Exception { | ||
// construct a new executor that will run async tasks | ||
var executor = new ThreadAsyncExecutor(); | ||
|
||
// start few async tasks with varying processing times, two last with callback handlers | ||
final var asyncResult1 = executor.startProcess(lazyval(10, 500)); | ||
final var asyncResult2 = executor.startProcess(lazyval("test", 300)); | ||
final var asyncResult3 = executor.startProcess(lazyval(50L, 700)); | ||
final var asyncResult4 = executor.startProcess(lazyval(20, 400), callback("Deploying lunar rover")); | ||
final var asyncResult5 = | ||
executor.startProcess(lazyval("callback", 600), callback("Deploying lunar rover")); | ||
|
||
// emulate processing in the current thread while async tasks are running in their own threads | ||
Thread.sleep(350); // Oh boy, we are working hard here | ||
log("Mission command is sipping coffee"); | ||
|
||
// wait for completion of the tasks | ||
final var result1 = executor.endProcess(asyncResult1); | ||
final var result2 = executor.endProcess(asyncResult2); | ||
final var result3 = executor.endProcess(asyncResult3); | ||
asyncResult4.await(); | ||
asyncResult5.await(); | ||
|
||
// log the results of the tasks, callbacks log immediately when complete | ||
log("Space rocket <" + result1 + "> launch complete"); | ||
log("Space rocket <" + result2 + "> launch complete"); | ||
log("Space rocket <" + result3 + "> launch complete"); | ||
} | ||
``` | ||
|
||
यहां प्रोग्राम कंसोल आउटपुट है। | ||
|
||
```java | ||
21:47:08.227 [executor-2] INFO com.iluwatar.async.method.invocation.App - Space rocket <test> launched successfully | ||
21:47:08.269 [main] INFO com.iluwatar.async.method.invocation.App - Mission command is sipping coffee | ||
21:47:08.318 [executor-4] INFO com.iluwatar.async.method.invocation.App - Space rocket <20> launched successfully | ||
21:47:08.335 [executor-4] INFO com.iluwatar.async.method.invocation.App - Deploying lunar rover <20> | ||
21:47:08.414 [executor-1] INFO com.iluwatar.async.method.invocation.App - Space rocket <10> launched successfully | ||
21:47:08.519 [executor-5] INFO com.iluwatar.async.method.invocation.App - Space rocket <callback> launched successfully | ||
21:47:08.519 [executor-5] INFO com.iluwatar.async.method.invocation.App - Deploying lunar rover <callback> | ||
21:47:08.616 [executor-3] INFO com.iluwatar.async.method.invocation.App - Space rocket <50> launched successfully | ||
21:47:08.617 [main] INFO com.iluwatar.async.method.invocation.App - Space rocket <10> launch complete | ||
21:47:08.617 [main] INFO com.iluwatar.async.method.invocation.App - Space rocket <test> launch complete | ||
21:47:08.618 [main] INFO com.iluwatar.async.method.invocation.App - Space rocket <50> launch complete | ||
``` | ||
|
||
# क्लास डायग्राम | ||
|
||
![alt text](../../../async-method-invocation/etc/async-method-invocation.png "Async Method Invocation") | ||
|
||
## प्रयोज्यता | ||
|
||
जब async विधि मंगलाचरण पैटर्न का उपयोग करें | ||
|
||
* आपके पास कई स्वतंत्र कार्य हैं जो समानांतर में चल सकते हैं | ||
* आपको अनुक्रमिक कार्यों के समूह के प्रदर्शन में सुधार करने की आवश्यकता है | ||
* आपके पास सीमित मात्रा में प्रसंस्करण क्षमता या लंबे समय तक चलने वाले कार्य हैं और कॉल करने वाले को कार्यों के तैयार होने का इंतजार नहीं करना चाहिए | ||
|
||
## वास्तविक दुनिया के उदाहरण | ||
|
||
* [FutureTask](http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/FutureTask.html) | ||
* [CompletableFuture](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html) | ||
* [ExecutorService](http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html) | ||
* [Task-based Asynchronous Pattern](https://msdn.microsoft.com/en-us/library/hh873175.aspx) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,137 @@ | ||
--- | ||
title: Balking | ||
category: Concurrency | ||
language: hi | ||
tag: | ||
- Decoupling | ||
--- | ||
|
||
## हेतु | ||
|
||
बाल्किंग पैटर्न का उपयोग किसी ऑब्जेक्ट को किसी निश्चित कोड को निष्पादित करने से रोकने के लिए किया जाता है यदि वह अधूरा है | ||
या अनुचित स्थिति. | ||
|
||
## व्याख्या | ||
|
||
वास्तविक दुनिया का उदाहरण | ||
|
||
> कपड़े धोने की मशीन में कपड़े धोने की शुरुआत करने के लिए एक स्टार्ट-बटन होता है। धोते समय | ||
> मशीन निष्क्रिय है तो बटन अपेक्षानुसार काम करता है, लेकिन यदि वह पहले से ही धुलाई कर रहा है तो बटन काम करता है | ||
> कुछ नहीं. | ||
साफ़ शब्दों में | ||
|
||
> बैल्किंग पैटर्न का उपयोग करते हुए, एक निश्चित कोड केवल तभी निष्पादित होता है जब ऑब्जेक्ट विशेष स्थिति में हो। | ||
विकिपीडिया कहता है | ||
|
||
> बैल्किंग पैटर्न एक सॉफ्टवेयर डिज़ाइन पैटर्न है जो किसी ऑब्जेक्ट पर केवल तभी क्रिया निष्पादित करता है | ||
> वस्तु एक विशेष अवस्था में है। उदाहरण के लिए, यदि कोई ऑब्जेक्ट ज़िप फ़ाइलें और कॉलिंग पढ़ता है | ||
> विधि ऑब्जेक्ट पर एक गेट विधि को लागू करती है जब ज़िप फ़ाइल खुली नहीं होती है, तो ऑब्जेक्ट "बाल्क" हो जाएगा | ||
> अनुरोध पर. | ||
**प्रोग्रामेटिक उदाहरण** | ||
|
||
इस उदाहरण के कार्यान्वयन में, `WashingMachine` एक ऑब्जेक्ट है जिसमें दो स्थितियाँ हैं जिनमें यह हो सकता है | ||
होना: सक्षम और धुलाई। यदि मशीन सक्षम है, तो थ्रेड-सेफ का उपयोग करके स्थिति वॉशिंग में बदल जाती है | ||
तरीका। दूसरी ओर, यदि यह पहले से ही धुलाई कर रहा है और कोई अन्य थ्रेड `wash()` निष्पादित करता है | ||
यह ऐसा नहीं करेगा और बिना कुछ किए वापस लौट आएगा। | ||
|
||
यहां `WashingMachine` वर्ग के प्रासंगिक भाग दिए गए हैं। | ||
|
||
```java | ||
@Slf4j | ||
public class WashingMachine { | ||
|
||
private final DelayProvider delayProvider; | ||
private WashingMachineState washingMachineState; | ||
|
||
public WashingMachine(DelayProvider delayProvider) { | ||
this.delayProvider = delayProvider; | ||
this.washingMachineState = WashingMachineState.ENABLED; | ||
} | ||
|
||
public WashingMachineState getWashingMachineState() { | ||
return washingMachineState; | ||
} | ||
|
||
public void wash() { | ||
synchronized (this) { | ||
var machineState = getWashingMachineState(); | ||
LOGGER.info("{}: Actual machine state: {}", Thread.currentThread().getName(), machineState); | ||
if (this.washingMachineState == WashingMachineState.WASHING) { | ||
LOGGER.error("Cannot wash if the machine has been already washing!"); | ||
return; | ||
} | ||
this.washingMachineState = WashingMachineState.WASHING; | ||
} | ||
LOGGER.info("{}: Doing the washing", Thread.currentThread().getName()); | ||
this.delayProvider.executeAfterDelay(50, TimeUnit.MILLISECONDS, this::endOfWashing); | ||
} | ||
|
||
public synchronized void endOfWashing() { | ||
washingMachineState = WashingMachineState.ENABLED; | ||
LOGGER.info("{}: Washing completed.", Thread.currentThread().getId()); | ||
} | ||
} | ||
``` | ||
|
||
यहां `WashingMachine` द्वारा उपयोग किया जाने वाला सरल `DelayProvider` इंटरफ़ेस है। | ||
|
||
```java | ||
public interface DelayProvider { | ||
void executeAfterDelay(long interval, TimeUnit timeUnit, Runnable task); | ||
} | ||
``` | ||
|
||
अब हम `WashingMachine` का उपयोग करके एप्लिकेशन का परिचय देते हैं। | ||
|
||
```java | ||
public static void main(String... args) { | ||
final var washingMachine = new WashingMachine(); | ||
var executorService = Executors.newFixedThreadPool(3); | ||
for (int i = 0; i < 3; i++) { | ||
executorService.execute(washingMachine::wash); | ||
} | ||
executorService.shutdown(); | ||
try { | ||
executorService.awaitTermination(10, TimeUnit.SECONDS); | ||
} catch (InterruptedException ie) { | ||
LOGGER.error("ERROR: Waiting on executor service shutdown!"); | ||
Thread.currentThread().interrupt(); | ||
} | ||
} | ||
``` | ||
|
||
यहां प्रोग्राम का कंसोल आउटपुट है। | ||
|
||
``` | ||
14:02:52.268 [pool-1-thread-2] INFO com.iluwatar.balking.WashingMachine - pool-1-thread-2: Actual machine state: ENABLED | ||
14:02:52.272 [pool-1-thread-2] INFO com.iluwatar.balking.WashingMachine - pool-1-thread-2: Doing the washing | ||
14:02:52.272 [pool-1-thread-3] INFO com.iluwatar.balking.WashingMachine - pool-1-thread-3: Actual machine state: WASHING | ||
14:02:52.273 [pool-1-thread-3] ERROR com.iluwatar.balking.WashingMachine - Cannot wash if the machine has been already washing! | ||
14:02:52.273 [pool-1-thread-1] INFO com.iluwatar.balking.WashingMachine - pool-1-thread-1: Actual machine state: WASHING | ||
14:02:52.273 [pool-1-thread-1] ERROR com.iluwatar.balking.WashingMachine - Cannot wash if the machine has been already washing! | ||
14:02:52.324 [pool-1-thread-2] INFO com.iluwatar.balking.WashingMachine - 14: Washing completed. | ||
``` | ||
|
||
## क्लास डायग्राम | ||
|
||
![alt text](../../../balking/etc/balking.png "Balking") | ||
|
||
## प्रयोज्यता | ||
|
||
जब बाल्किंग पैटर्न का प्रयोग करें | ||
|
||
* आप किसी वस्तु पर तभी कोई कार्रवाई करना चाहते हैं जब वह किसी विशेष स्थिति में हो | ||
* वस्तुएँ आम तौर पर केवल ऐसी स्थिति में होती हैं जो अस्थायी रूप से लेकिन किसी अज्ञात के लिए झुकने की संभावना होती है | ||
लगने वाला समय | ||
|
||
## संबंधित पैटर्न | ||
|
||
* [Guarded Suspension Pattern](https://java-design-patterns.com/patterns/guarded-suspension/) | ||
* [Double Checked Locking Pattern](https://java-design-patterns.com/patterns/double-checked-locking/) | ||
|
||
## श्रेय | ||
|
||
* [Patterns in Java: A Catalog of Reusable Design Patterns Illustrated with UML, 2nd Edition, Volume 1](https://www.amazon.com/gp/product/0471227293/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=javadesignpat-20&creative=9325&linkCode=as2&creativeASIN=0471227293&linkId=0e39a59ffaab93fb476036fecb637b99) |
Oops, something went wrong.