【问题标题】:Event Driven Future<V> - Thread Pool事件驱动的未来<V> - 线程池
【发布时间】:2011-10-23 17:58:58
【问题描述】:

我们使用callable&lt;V&gt;Future&lt;V&gt; 从线程池接收终止线程的结果。我们应该调用get() 来接收返回的结果。我的问题是:它不是事件驱动的。是否有任何框架可以为 C 中的子进程获得类似 SIGCHLD 的结果? 我想要这样的东西:(当池中的每个线程完成工作时,线程池将调用此函数)

public void fetchResult(Thread t, Runnable r, Future<Integer> result) {
    Integer x = result.get();
    /* handle x */
    /* also we have Thread and Runnable object that has terminated */
}

【问题讨论】:

  • 你能不能再表达一下?目前还不清楚你到底想要什么
  • “事件驱动”的哪一部分对您来说很重要?我假设这不是缺少忙等待,因为 Future.get() 不忙等待。
  • @Avi:它不会忙等待,但会锁定。我不想锁。我希望主线程做一些工作。当池中的线程终止时,池调用一个函数,当我调用 Future.get() 时,它会在该函数中立即返回。

标签: java multithreading callable


【解决方案1】:

您可能想查看ThreadPoolExecutor.afterExecute() 方法。每个任务完成后都会调用它。您可以创建 ThreadPoolExecutor 的自定义子类,它具有您想要的基于事件的回调行为。

【讨论】:

    【解决方案2】:

    您可以轻松创建事件驱动模板。以下伪代码说明了一种方法。

    abstract class EventTemplate<T> implements Runnable {
        private BlockingQueue<T> queue; 
    
        public void submit(Callable<T> callable) {
            queue.add(callable);
        }
    
        public abstract void handleEvent(T t);
    
        public void run() {
            for(;;) handleEvent(queue.take());
        }
    
        public void start() {
             new Thread(this).start();
        }
    }
    

    类可以扩展模板

    class FooEventHandler extends EventTemplate<Foo> {
        public void handleEvent(Foo foo) {
            // do something 
        }
    }
    

    可以实例化的

    new FooEventHandler().start();
    

    【讨论】:

    • Callable 实际在哪里执行?
    猜你喜欢
    • 2011-10-07
    • 2010-12-25
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    • 2018-01-03
    • 2015-10-06
    • 2011-04-23
    相关资源
    最近更新 更多