- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
有一个名为“ConcurrencyUtils”的实用程序类,它在内部使用 ExecutorService
private static final ExecutorService executor = Executors.newCachedThreadPool(new CommonPoolThreadFactory());
正如您所看到的,它使用一个线程池,该线程池将根据需要添加线程。问题是,如果该池中至少有一个线程(如果 util 至少使用一次),那么当主方法执行完成应用程序时,应用程序并没有关闭,因为线程仍然活着并且没有被垃圾收集......
最初我尝试使用
public static void close(){
executor.shutdown();
}
并在程序自然应该停止执行时调用它。但不能保证 main 方法是最后一个完成的方法,并且在应用程序终止之前可能还有其他任务应该完成,因此我不知道在哪里调用“close()”来清除 util 中的线程...
我想知道社区是否可以提示我一种更智能/更干净的方法来实现这一点?
ConcurrencyUtil 旨在可供任何地方使用,但我无法创建它的实例,我需要它通过静态非实例方法提供其接口(interface)。
<小时/>让我详细解释一下这个例子,ConcurrencyUtil 有自己的池实现,它提供了有用的方法来链接多个可运行对象并并行执行它们,或者让其中一些等待其他可运行对象完成然后执行...没关系,它应该是一个实用程序类,这样无论何时您想要使用 async() 或 chain() 并且不用担心它是如何工作的。
现在是示例代码:
public static void main(String[] args) {
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
System.out.println("hoooooooooooook");
}
});
ConcurrencyUtil.chain()
.add(()->System.out.println("task 1"))
.add(()->System.out.println("task 2"))
.execute()
.join();
System.out.println("main finish");
}
当执行时我会得到这个:
created new thread with name [common-pool : thread-1]
created new thread with name [common-pool : thread-2]
task 1
task 2
main finish
正如您所看到的,线程池创建了两个线程并执行并发任务,但这些工作线程仍然处于 Activity 状态(处于 sleep 状态)等待新任务,这就是为什么在主执行完成后应用程序仍在运行...并且关闭 Hook 也不起作用,因为(我想)应用程序被认为是 Activity 的...
现在鉴于我不能保证 main 方法是我的退出点(它可能是一个可运行的方法,例如,如果我删除 .join() ,则完成执行),这就是为什么我不能放置 finally block 并关闭 ConcurrencyUtil...
有什么想法可以正确地做到这一点吗?
最佳答案
应用程序设计的正确方法是引入一个显式关闭过程,该过程从任何适当的地方调用。然后,此过程可以在执行程序服务上调用 shutdown()
,然后调用 awaitTermination()
。查看 ExecutorService
的 Javadoc 以获取完整的代码示例。
除了常规关闭协议(protocol)之外,您还可以提供 JVM 关闭 Hook ,它将再次启动相同的关闭过程。您永远不应该依赖该机制,但在出现不可预测的故障时拥有它是一件好事。
关于java - 使用 ExecutorService 时正确管理内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25868660/
我有一个executorService,它不等待executorService部分完成,它直接返回返回值而不等待下面是我的代码:请查看我是否正确实现了executorService,并在需要时帮助我纠
我有一个运行在另一个执行器服务中的执行器服务来发送电子邮件。如果我在外部执行程序上调用关闭,它正在等待内部执行程序服务关闭,这会极大地影响响应时间。 private final ExecutorSer
我有两个 ExecutorService 实例:一个有 4 个线程,另一个有 20 个线程。我希望单击按钮后,服务 1 就会停止并等待服务 2 结束。之后,服务1继续运行。 我尝试使用 wait 和
我目前有一个 ExecutorService,我想要以下内容: 不应接受任何新任务。 当前任务仍应继续执行。 应返回所有当前排队的任务。 我面临的问题是 shutdown() 不会返回任何未执行的已提
/** * Blocks until all tasks have completed execution after a shutdown * request, or the timeout o
我在线程 A 上创建 ExecutorService,然后线程 B 在 ExecutorService 上调用 shutdown() 和 awaitTermination()。 假设在线程B创建之前所
为了提高请求的响应时间,我打算使用 executorService 并将工作分配给多个线程,以减少请求的响应时间。 但是在阅读文章和博客后,为每个请求创建新的线程池也会影响性能。 闲置方法是什么,-1
我正在学习使用 ExectorService 来汇集 threads 并发送任务。我下面有一个简单的程序 import java.util.concurrent.ExecutorService; im
这是我为暴露我的问题所做的一个简化示例。我有任务doSomeWork()我使用 ExecutorService(一次最多 4 个线程)以多线程方式处理。但是,如果任何线程/任务产生异常,我想: 停止处
我的类路径中有 Guava ,想使用 ListenableFuture s,但目前我不知道如何提交ListenableFuture s 还是目前只能在调用线程中没有执行程序的情况下使用它们?我读过 r
我正在学习 ExecutorService 和 Callables,但收到来自 intelij 的警告,说我正在为此行进行未经检查的分配: Future> future = executorServi
我正在编写一个 Java Fractal Explorer,分形计算是多线程完成的。以前,我只是创建了一堆线程(与系统有处理器内核一样多)并将它们保存在一个数组中,但这会导致一些问题并且不是很优雅,现
我想加入两个在 ExecutorService 中执行的线程。 public class CURD { public static ExecutorService executorService
我有一个工作单元列表,我想并行处理它们。每个单元工作 8-15 秒,完全计算时间,没有 I/O 阻塞。我想要实现的是拥有一个 ExecutorService那: 当没有工作要做时,实例化的线程为零 如
我想同时向最多 10 个用户发送 ping,并在 ping 完成后用结果更新用户对象。 为了做到这一点,我尝试使用 ExecutorService . 我从这样的代码开始: private void
我有一个在 ForkJoinPool 线程池中执行的递归批量任务。 public class SomeTask extends RecursiveAction { @Override
我有一个要遍历的列表,并且对于列表中的每个值都将调用一个方法。现在我已经将相关方法放在一个线程中,并使用执行器服务来并行处理这些方法。但是,对于列表中的每个值,该方法最终会由于某种原因被调用两次。 E
这个问题已经有答案了: How to wait for all threads to finish, using ExecutorService? (27 个回答) 已关闭 4 年前。 我正在尝试使用
我有一个基于ExecutorService线程流量调节的问题:我想 .submit() 多个线程来执行,我希望一些线程等待,直到特定的先前线程完成执行。 。 到目前为止,我知道一种通过使用 Count
我想知道这段代码是否正确。当我在构造对象本身时将可运行对象提交给执行器服务时,这不会导致问题吗? public class A implements Runnable { public
我是一名优秀的程序员,十分优秀!