gpt4 book ai didi

java - 如何在 Java 中使用线程池概念?

转载 作者:搜寻专家 更新时间:2023-10-31 08:17:54 25 4
gpt4 key购买 nike

我正在用 java 创建一个 http 代理服务器。我有一个名为 Handler 的类,它负责分别处理来自 Web 浏览器和 Web 服务器的请求和响应。我还有另一个名为 Copy 的类,它将 inputStream 对象复制到 outputStream 对象。这两个类都实现了Runnable 接口(interface)。我想在我的设计中使用线程池的概念,但我不知道该怎么做!任何提示或想法将不胜感激。

最佳答案

我建议你看看Executor和ExecutorService。他们添加了很多好东西,使线程池的使用更容易。

...

@Azad 提供了一些很好的信息和链接。您还应该购买并阅读Java Concurrency in Practice 一书。 (通常缩写为 JCiP)请注意 stackoverflow 大佬们 - 一些与亚马逊的收入链接怎么样???

下面是我对如何通过线程池使用和利用 ExecutorService 的简要总结。假设您希望池中有 8 个线程。

您可以使用 ThreadPoolExecutor 的全功能构造函数创建一个,例如

ExecutorService service = new ThreadPoolExecutor(8,8, more args here...);

或者您可以使用更简单但可定制性较低的 Executors 工厂,例如

ExecutorService service = Executors.newFixedThreadPool(8);

您立即获得的一个优势是能够 shutdown()shutdownNow() 线程池,并通过 isShutdown()< 检查此状态isTerminated()

如果您不太关心您希望运行的 Runnable,或者它们编写得非常好、自包含、从不失败或适本地记录任何错误等...您可以调用

execute(Runnable r);

如果您确实关心结果(例如,它计算 pi 或从网页下载图像)和/或您关心是否有异常,您应该使用返回 Future 的提交方法之一。这允许您在将来的某个时间检查任务是否 isDone() 并通过 get() 检索结果。如果有异常,get() 将抛出它(包含在 ExecutionException 中)。注意 - 即使你的 Future 没有“返回”任何东西(它是 Void 类型),调用 get()(忽略 void 结果)来测试异常仍然是一个好习惯。

但是,这种检查 Future 有点像先有鸡还是先有蛋的问题。线程池的全部意义在于无阻塞地提交任务。但是 Future.get() 会阻塞,而 Future.isDone() 会回避以下问题:哪个线程正在调用它,如果它没有完成它会做什么 - 你会 sleep() 并阻塞吗?

如果您同时提交一个已知的相关任务 block ,例如,您正在执行一些大型数学计算,例如可以并行完成的矩阵乘法,并且没有特别的优势获取部分结果,可以调用invokeAll()。然后调用线程将阻塞,直到所有任务完成,此时您可以对所有 Futures 调用 Future.get()

如果任务更加脱节,或者您真的想使用部分结果怎么办?使用 ExecutorCompletionService,它包装了一个 ExecutorService。当任务完成时,它们被添加到队列中。这使得单个线程可以轻松地从队列中轮询和删除事件。 JCiP 有一个很好的网页应用程序示例,它并行下载所有图像,并在图像可用时立即呈现它们以进行响应。

关于java - 如何在 Java 中使用线程池概念?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8767527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com