假设您想要执行一些任务。由于通过单个线程执行它可能需要相当长的时间才能获得结果,因此您决定使用可靠的 ExecutorService 通过多个线程处理它。
这是一个示例:
public static void main(String[] args) { ExecutorService executorService = Executors.newFixedThreadPool(5); for (int i = 0; i { task(temp); }); } executorService.shutdown(); System.out.println("ExecutorService is shutdown"); } private static void task(int temp) { try { TimeUnit.SECONDS.sleep(1L); System.out.println("Task " + temp + " completed"); } catch (InterruptedException e) { throw new RuntimeException(e); } }
当然,像往常一样,如果不使用“睡眠”作为任务执行的原型,任何线程示例都是不完整的。
它输出,
ExecutorService is shutdown Task 1 completed Task 2 completed Task 0 completed Task 4 completed Task 3 completed
现在想象一下有一个无穷无尽的任务队列,而你不知道其中的数量。也许它们是由数据库中动态添加的条目数量决定的。
例如,一家银行,它必须全天处理大量交易。交易结束时间为下午5点,超过该时间将不再接受任何额外任务。
但是,您确实知道任务的数量是有限的,并且将在某个时间点结束。
如何知道所有任务完成的时间点?
如果您注意到上面的代码片段,ExecutorService.shutdown() 会使主线程立即退出,但后台线程仍然处理已接受的任务直至完成。有什么方法可以让您收到完成通知吗?
我想到了几个解决方案:
- 使用 CountDownLatch 来计算任务 - 但由于您不知道任务的数量,所以使用它是不切实际的。
- 使用ExecutorService.awaitTermination()。然而,这里的时间仍然是不确定的。您可以使用非常自由的 ExecutorService.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS) 或类似的东西。但这又是一个阻塞调用。
有更好的方法来解决这个问题吗?
Java 确实提供了一种更好且相对未知的方法来解决这个问题。这里的“技巧”是要知道 Executors.newFixedThreadPool 本质上是一个具有预定义值的 ThreadPoolExecutor。我们来看看 Executors.newFixedThreadPool 的实现。
public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<runnable>()); } </runnable>
我真的建议阅读这里的 ThreadPoolExecutor 文档。 ExecutorService 是 ThreadPoolExecutor 的便捷包装。
...强烈建议程序员使用更方便的Executors工厂方法Executors.newCachedThreadPool()(无界线程池,具有自动线程回收功能)、Executors.newFixedThreadPool(int)(固定大小线程池)和Executors.newSingleThreadExecutor( )(单后台线程),为最常见的使用场景预配置设置。
将帮助我们解决问题的部分是:
钩子方法
此类提供了受保护的可重写 beforeExecute(Thread, Runnable) 和 afterExecute(Runnable, Throwable) 方法,这些方法在每个任务执行之前和之后调用。这些可用于操纵执行环境;例如,重新初始化 ThreadLocals、收集统计信息或添加日志条目。此外,可以重写方法终止()以执行执行器完全终止后需要完成的任何特殊处理。
我们可以使用终止方法来通知我们同样的事情!但我们该如何使用它呢?
public static void main(String[] args) { ExecutorService executorService = Executors.newFixedThreadPool(5); for (int i = 0; i { task(temp); }); } executorService.shutdown(); System.out.println("ExecutorService is shutdown"); } private static void task(int temp) { try { TimeUnit.SECONDS.sleep(1L); System.out.println("Task " + temp + " completed"); } catch (InterruptedException e) { throw new RuntimeException(e); } }
如果您不喜欢匿名类(像我一样),您始终可以自己扩展 ThreadPoolExecutor 来创建自定义类。
ExecutorService is shutdown Task 1 completed Task 2 completed Task 0 completed Task 4 completed Task 3 completed
这是验证它是否按照我们的预期工作的输出。
public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<runnable>()); } </runnable>
您还使用了哪些其他相对未知的片段?请在评论中告诉我!
以上是掌握 ExecutorService 关闭:跟踪线程池终止的详细内容。更多信息请关注PHP中文网其他相关文章!

Java在不同操作系统上的表现存在细微差异。1)JVM实现不同,如HotSpot、OpenJDK,影响性能和垃圾回收。2)文件系统结构和路径分隔符不同,需使用Java标准库处理。3)网络协议实现差异影响网络性能。4)GUI组件外观和行为在不同系统上有别。通过使用标准库和虚拟机测试,可减少这些差异的影响,确保Java程序稳定运行。

javaoffersrobustobject-IentiendedProgrammming(OOP)和Top-Notchsecurityfeatures.1)OopinjavainCludesClasses,对象,继承,多态性,和列出,andeclingfleximaintainablesys.ss.2)SecurityFeateTuersLudEtersludEterMachine(

JavaScriptandJavahavedistinctstrengths:JavaScriptexcelsindynamictypingandasynchronousprogramming,whileJavaisrobustwithstrongOOPandtyping.1)JavaScript'sdynamicnatureallowsforrapiddevelopmentandprototyping,withasync/awaitfornon-blockingI/O.2)Java'sOOPf

JAVAACHIEVESPLATFORMINDEPENTENCETHROUGHJAVAVIRTAILMACHINE(JVM)和BYTECODE.1)THEJVMINTERPRETSBBYTECODE,允许theingthesmecodetorunonanyanyanyanyplatformwithajvm.2)

Java'splatFormIndependecemeanSapplicationsCanrunonAnyPlatFormWithAjvm,使“ Writeonce,RunanyWhere”。

JVM'SperformanceIsCompetitiveWithOtherRuntimes,operingabalanceOfspeed,安全性和生产性。1)JVMUSESJITCOMPILATIONFORDYNAMICOPTIMIZAIZATIONS.2)c提供NativePernativePerformanceButlanceButlactsjvm'ssafetyFeatures.3)

JavaachievesPlatFormIndependencEthroughTheJavavIrtualMachine(JVM),允许CodeTorunonAnyPlatFormWithAjvm.1)codeisscompiledIntobytecode,notmachine-specificodificcode.2)bytecodeisisteredbytheybytheybytheybythejvm,enablingcross-platerssectectectectectross-eenablingcrossectectectectectection.2)

TheJVMisanabstractcomputingmachinecrucialforrunningJavaprogramsduetoitsplatform-independentarchitecture.Itincludes:1)ClassLoaderforloadingclasses,2)RuntimeDataAreafordatastorage,3)ExecutionEnginewithInterpreter,JITCompiler,andGarbageCollectorforbytec


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

SublimeText3 Linux新版
SublimeText3 Linux最新版

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中