首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Executor框架中执行所有线程时捕获事件

在Executor框架中执行所有线程时捕获事件
EN

Stack Overflow用户
提问于 2015-04-22 09:19:46
回答 3查看 1.4K关注 0票数 1

我使用Java框架同时执行多个线程。在执行完所有线程之后,我想做一些操作。执行器框架中是否有侦听器或事件捕获机制?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-22 09:35:32

您可以考虑从ThreadPoolExecutor迁移到ScheduledThreadPoolExecutor。不同的是,对于所有排队的任务,您将得到一个Future

这允许您检查提交的任务的.isDone()并相应地采取行动。特别有趣的是,如果您需要使用您提交的内容的结果,那么您可以干净地执行.get(),而不会阻塞调用线程,直到执行完成为止。

另一种选择可能是实现ThreadFactory,它生成一个额外的侦听器线程以join()主线程,并在完成时通知您。

票数 3
EN

Stack Overflow用户

发布于 2015-04-22 09:23:37

ThreadPoolExecutor的API接口描述了一些可能对此有用的钩子:

钩法 该类提供了在执行每个任务之前和之后调用的受保护的overridable beforeExecute(java.lang.Thread,java.lang.Runnable)和afterExecute(java.lang.Runnable,java.lang.Throwable)方法。这些工具可用于操作执行环境;例如,重新初始化ThreadLocals、收集统计信息或添加日志条目。此外,可以重写any ()方法,以执行执行程序完全终止后需要执行的任何特殊处理。 如果钩子或回调方法引发异常,内部工作线程可能会失败并突然终止。

请参阅https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html

票数 4
EN

Stack Overflow用户

发布于 2015-04-22 09:23:38

代码语言:javascript
复制
        A a = new A();
        B b= new B();
        FutureTask fa = new FutureTask (a);
        FutureTask fb = new FutureTask (b);
        ExecutorService es = Executors.newFixedThreadPool(2); 
        es.submit (fa);
        es.submit(fb);



        String getName = (String)a.get();
        String getSurName = (String)b.get();

        es.shutdown ();

        ***//Here all threads are executed and 
        //you can write any code which you want to execute after 
         //finishing all the threads.***

或者其他的工作。……您可以使用LocalThrad类编写守护进程类,并生成线程,它将充当侦听器。

在这种情况下,您可以通过使用上面的守护进程类来实现您想要实现的任何目标。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29792990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档