栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java执行程序:如何在任务完成时无阻碍地得到通知?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java执行程序:如何在任务完成时无阻碍地得到通知?

定义一个回调接口,以接收要在完成通知中传递的任何参数。然后在任务结束时调用它。

你甚至可以为Runnable任务编写通用包装,并将其提交给

ExecutorService
。或者,请参阅下面的Java 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();  }}

使用CompletableFutureJava 8,Java 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);     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()));  }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/404850.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号