繁体   English   中英

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

[英]How to use Thread Pool concept in Java?

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

我建议你看看 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()线程池shutdown()shutdownNow() ,并通过isShutdown()isTerminated()检查此状态。

如果你不太关心你想运行的 Runnable,或者它们写得很好,自包含,从不失败或适当地记录任何错误等......你可以调用

execute(Runnable r);

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

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

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

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

希望以下能帮到你:,

类执行者
执行提交的Runnable任务的object 该接口提供了一种将任务提交与每个任务将如何运行的机制分离的方法,包括线程使用、调度等细节。通常使用 Executor 而不是显式创建threads 例如,而不是调用new Thread(new(RunnableTask())).start()为每一个组任务,您可以使用:

Executor executor = anExecutor;
 executor.execute(new RunnableTask1());
 executor.execute(new RunnableTask2());
 ...


类 ScheduledThreadPoolExecutor
一个ThreadPoolExecutor可以额外安排命令在给定的延迟后运行,或定期执行 当需要多个工作线程时,或者需要ThreadPoolExecutor (此类扩展)的额外灵活性或功能时,此类比 Timer 更可取。

延迟任务在启用后立即执行,但没有任何关于启用后何时开始的实时保证。 计划执行时间完全相同的任务按提交的first-in-first-out (FIFO)顺序启用。


接口ExecutorService
一个Executor提供管理终止的方法和可以生成 Future 以跟踪一个或多个异步任务进度的方法

ExecutorService可以关闭,这将导致它停止接受新任务。 被关闭后,executor最终会终止,此时没有任务在主动执行,没有任务在等待执行,也没有新的任务可以提交。

编辑:
您可以找到使用ExecutorExecutorService示例
这里
这里
在这里
问题对你有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM