সমাপ্তির বিজ্ঞপ্তিতে আপনি যে কোনও প্যারামিটারগুলি পাস করতে চান তা পেতে কলব্যাক ইন্টারফেসটি সংজ্ঞায়িত করুন। তারপরে টাস্ক শেষে এটিকে অনুরোধ করুন।
আপনি রান্নেবল টাস্কগুলির জন্য একটি সাধারণ মোড়ক লিখতেও পারেন এবং এগুলিতে জমা দিতে পারেন 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()));
}
}