Java并发教程–线程池
首先,線程池。 讓我們直接進(jìn)入java.util.concurrent.ExecutorService ,它為我們提供了線程池的基本接口。 所有線程池都允許提交Callable或Runnable實例以供將來執(zhí)行。 它們還提供各種池管理方法。
泳池管理
池存在各種管理方法。 您可以使用shutdown()池,該池將拒絕將來的所有提交,但將完全處理進(jìn)程內(nèi)執(zhí)行,甚至還包括尚未開始但在關(guān)閉啟動之前提交的進(jìn)程。 您還可以更積極地執(zhí)行shutdownNow()。 這也將阻止將來提交任何內(nèi)容,但是它具有一些不同的顯著行為。 它不會開始執(zhí)行已提交但尚未開始的任務(wù)。 它們將在返回的列表中。 它還將嘗試停止或更準(zhǔn)確地說是當(dāng)前正在執(zhí)行任務(wù)的Thread.interrupt() 。 這是最大的努力,不能保證成功完成這些任務(wù)。
線程工廠
稍后,我們將進(jìn)入java.util.concurrent.Executors構(gòu)建器類,該類可以創(chuàng)建各種線程池配置,但首先讓我們集中討論使用ThreadFactory。 您將需要利用Executor中的ThreadFactory支持,并養(yǎng)成提供自己的習(xí)慣。 默認(rèn)的ThreadFactory將為您提供一個遞增編號的池命名方案,這在日志或其他監(jiān)視中并不是很有用。 對于創(chuàng)建的第一個池,您將獲得名為pool-1-thread-1 , pool-1-thread-2的線程 ,第二個以pool-2-thread-1開頭的線程 ,等等。通過提供自己的ThreadFactory ,您可以具有名為ReportProcessingThread1和HttpThread1的線程。 這是一個簡單的例子:
private AtomicLong counter = new AtomicLong(); private String name; public Thread newThread(Runnable r) {Thread t = new Thread(r);t.setName(name + counter.incrementAndGet());return t; }僅當(dāng)創(chuàng)建新線程時才調(diào)用ThreadFactory 。 鑒于JDK線程池將盡可能重用線程,因此不能使用此類來管理執(zhí)行的開始。
執(zhí)行器生成器方法
現(xiàn)在回到Executors實用程序構(gòu)建器方法。 他們是:
- newCachedThreadPool()將為您提供一個線程池,該線程池將在可能的情況下重用線程,并根據(jù)需要創(chuàng)建新線程,而沒有配置的限制。
- newFixedThreadPool(int nThreads)將為您提供一個線程池,該線程池將僅使用指定數(shù)量的線程,但將接受與提交的任務(wù)一樣多的任務(wù),以便按提交順序運(yùn)行它們。
- newScheduledThreadPool(int corePoolSize)專門用于按延遲執(zhí)行的周期性計劃來調(diào)度執(zhí)行延遲的線程。 返回的線程池實現(xiàn)ScheduledExecutorService ,該服務(wù)公開了其他調(diào)度方法schedule(Runnable命令,長延遲,TimeUnit單位) , scheduleAtFixedRate(Runnable命令,長initialDelay,長周期,TimeUnit單位)和scheduleWithFixedDelay(Runnable命令,長initialDelay,長延遲, TimeUnit單位) 。
- newSingleThreadExecutor()和newSingleThreadScheduledExecutor() 。 這些對可以提交的任務(wù)數(shù)量沒有限制,僅確保一次執(zhí)行單個線程/任務(wù)。
最后,有一些幫助方法可用于從Runnable創(chuàng)建Callable實例。 這使我們進(jìn)入了新創(chuàng)建的結(jié)構(gòu)中,該結(jié)構(gòu)允許線程引發(fā)Exception和返回值,這是我們以前不得不非常痛苦地解決的問題。 在下一篇文章中,我們將考慮這些以及它們?nèi)绾闻c這些線程池一起使用。
參考: Java并發(fā)第3部分–來自我們的JCG合作伙伴的Carfey Software博客上的 線程池 。
相關(guān)文章 :- Java并發(fā)教程–信號量
- Java并發(fā)教程–重入鎖
- Java并發(fā)教程–可調(diào)用,將來
- Java并發(fā)教程–阻塞隊列
- Java并發(fā)教程– CountDownLatch
- Exchanger和無GC的Java
- Java Fork / Join進(jìn)行并行編程
- 使用迭代器時如何避免ConcurrentModificationException
- 改善Java應(yīng)用程序性能的快速技巧
翻譯自: https://www.javacodegeeks.com/2011/09/java-concurrency-tutorial-thread-pools.html
總結(jié)
以上是生活随笔為你收集整理的Java并发教程–线程池的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机动车年检新规2022年新规定(放宽了私
- 下一篇: 从JavaFX 1.3迁移到JavaFX