पूर्ण अधिसूचना में जो भी पैरामीटर आप पास करना चाहते हैं उसे प्राप्त करने के लिए कॉलबैक इंटरफ़ेस को परिभाषित करें। फिर इसे कार्य के अंत में लागू करें।
आप Runnable कार्यों के लिए एक सामान्य आवरण भी लिख सकते हैं, और इन्हें सबमिट कर सकते हैं ExecutorService
। या, जावा 8 में निर्मित तंत्र के लिए नीचे देखें।
class CallbackTask implements Runnable {
private final Runnable task;
private final Callback callback;
CallbackTask(Runnable task, Callback callback) {
this.task = task;
this.callback = callback;
}
public void run() {
task.run();
callback.complete();
}
}
CompletableFuture
जावा 8 के साथ , पाइपलाइनों की रचना करने के लिए एक अधिक विस्तृत साधन शामिल था जहां प्रक्रियाओं को अतुल्यकालिक और सशर्त रूप से पूरा किया जा सकता है। यहां अधिसूचना का एक वंचित लेकिन पूर्ण उदाहरण है।
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit;
public class GetTaskNotificationWithoutBlocking {
public static void main(String... argv) throws Exception {
ExampleService svc = new ExampleService();
GetTaskNotificationWithoutBlocking listener = new GetTaskNotificationWithoutBlocking();
CompletableFuture<String> f = CompletableFuture.supplyAsync(svc::work);
f.thenAccept(listener::notify);
System.out.println("Exiting main()");
}
void notify(String msg) {
System.out.println("Received message: " + msg);
}
}
class ExampleService {
String work() {
sleep(7000, TimeUnit.MILLISECONDS); /* Pretend to be busy... */
char[] str = new char[5];
ThreadLocalRandom current = ThreadLocalRandom.current();
for (int idx = 0; idx < str.length; ++idx)
str[idx] = (char) ('A' + current.nextInt(26));
String msg = new String(str);
System.out.println("Generated message: " + msg);
return msg;
}
public static void sleep(long average, TimeUnit unit) {
String name = Thread.currentThread().getName();
long timeout = Math.min(exponential(average), Math.multiplyExact(10, average));
System.out.printf("%s sleeping %d %s...%n", name, timeout, unit);
try {
unit.sleep(timeout);
System.out.println(name + " awoke.");
} catch (InterruptedException abort) {
Thread.currentThread().interrupt();
System.out.println(name + " interrupted.");
}
}
public static long exponential(long avg) {
return (long) (avg * -Math.log(1 - ThreadLocalRandom.current().nextDouble()));
}
}