Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 事件驱动的未来<;V>;-线程池_Java_Multithreading_Callable - Fatal编程技术网

Java 事件驱动的未来<;V>;-线程池

Java 事件驱动的未来<;V>;-线程池,java,multithreading,callable,Java,Multithreading,Callable,我们使用callable和Future从线程池接收终止线程的结果。我们应该调用get()来接收返回的结果。我的问题是:它不是事件驱动的。对于C中的子进程,是否有类似于SIGCHLD的框架来获得结果? 我想要这样的东西:(当池中的每个线程完成任务时,线程池将调用此函数) public void fetchResult(线程t、可运行r、未来结果){ 整数x=result.get(); /*手柄x*/ /*我们还有线程和已终止的可运行对象*/ } 您可以轻松创建事件驱动模板。下面的伪代码说明了一种方

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

public void fetchResult(线程t、可运行r、未来结果){
整数x=result.get();
/*手柄x*/
/*我们还有线程和已终止的可运行对象*/
}

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

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();
    }
}

您可能需要检查该方法。它在每个任务完成后调用。您可以创建ThreadPoolExecutor的自定义子类,该子类具有所需的基于事件的回调行为。

您可以进一步表达它吗?你到底想要什么还不清楚“事件驱动”的哪一部分对你很重要?我假设这不是因为缺少忙等待,因为Future.get()不忙等待。@Avi:它不忙等待,但它会锁定。我不想锁门。我想主线程做一些工作。当池中的线程终止时,池调用一个函数,在该函数中,当我调用
Future.get()
时,它立即返回。可调用的线程实际在哪里执行?
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();