【问题标题】:Fire and forget with java.util.concurrent使用 java.util.concurrent 触发并忘记
【发布时间】:2013-09-05 18:31:03
【问题描述】:

如何使用 java.util.concurrency 实现“一劳永逸”行为?我试过了:

ExecutorService executor = Executors.newSingleThreadExecutor();

public void push(Callable<Boolean> task) {
    Future<Boolean> future = executor.submit(task);
    future.get(timeout, timeoutUnit);
}

get() 一直阻塞直到完成。 push() 调用者对任务的结果不感兴趣。

【问题讨论】:

    标签: java java.util.concurrent fire-and-forget


    【解决方案1】:

    不要打电话给get()submit() 足以在 Thread 中启动 Callable。当您准备好获得结果时(如果有的话),您可以传递Future 并调用它的get()

    Javadoc 状态

    提交一个返回值的任务执行并返回一个Future 表示任务的未决结果。 Future 的 get 方法 成功完成后将返回任务的结果。

    如果您想立即阻止等待任务,可以使用 表单结果的构造 = exec.submit(aCallable).get();

    所以不要打电话给get()

    【讨论】:

    • 你说得对,但我只强调了一半:我的问题是有些任务永远不会结束。我不知道如何用超时设置submit()
    • @PhilippeBlayo 这不是提交的可能。如果您的任务永远不会结束,那么问题出在Callable。如果您需要结束线程,您可以随时尝试在Future 上调用cancel()
    • 如果你给了一个小的超时时间,比如 100 毫秒,那么它会抛出 TimeoutException,你可以捕获它并执行一个无操作来模拟火灾和忘记行为。
    【解决方案2】:

    如果你不得不忘记它,就不需要未来对象,即不关心线程的未来。 :)

    ExecutorService executor = Executors.newSingleThreadExecutor();
    
    public void push(Callable<Boolean> task) {
       executor.submit(task);
    }
    

    或者如果您需要在以后的某个时间使用未来:-

    ExecutorService executor = Executors.newSingleThreadExecutor();
    
    public void push(Callable<Boolean> task) {
       someCollection.add(executor.submit(task)); // use futures later
    }
    

    如果您根本不打算获得未来,或者只是使用 Executor 中的执行并传递 Runnable。

    ExecutorService executor = Executors.newSingleThreadExecutor();
    
    public void push(Runnable task) {
       executor.execute(task);
    }
    

    //execute 将在异常情况下调用默认的异常处理程序,如果您没有在提交方法中获取期货,则可能会丢失。

    【讨论】:

      猜你喜欢
      • 2014-12-06
      • 1970-01-01
      • 1970-01-01
      • 2021-04-17
      • 2020-01-31
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 2020-04-25
      相关资源
      最近更新 更多