如何在Java中使用线程池概念?
我在java中创建一个http代理服务器。 我有一个名为Handler的类,它负责处理来自Web浏览器和Web服务器的请求和响应。 我还有另一个名为Copy的类,它将inputStream对象复制到outputStream对象。 这两个类都实现了Runnable接口。 我想在我的设计中使用线程池的概念,但我不知道如何去做! 任何暗示或想法都将受到高度赞赏。
我建议你看一下Executor和ExecutorService。 他们添加了许多好东西,以便更容易使用线程池。
…
@Azad提供了一些很好的信息和链接。 您还应该购买并阅读“ Java Concurrency in Practice ”一书。 (通常缩写为JCiP)注意stackoverflow大假发 – 如何将一些收入链接到亚马逊?
下面是我对如何使用ExecutorService和利用线程池的简要总结。 假设您想要池中的8个线程。
您可以使用ThreadPoolExecutor的全function构造函数创建一个,例如
ExecutorService service = new ThreadPoolExecutor(8,8, more args here...);
或者您可以使用更简单但可自定义较少的Executors工厂,例如
ExecutorService service = Executors.newFixedThreadPool(8);
您立即获得的一个优点是能够shutdown()
或shutdownNow()
线程池,并通过isShutdown()
或isTerminated()
检查此状态。
如果你不太关心你想要运行的Runnable,或者它们写得很好,自包含,永不失败或者记录任何错误,等等……你可以打电话
execute(Runnable r);
如果您关心结果(例如,它计算pi或从网页下载图像)和/或您关心是否存在exception,则应使用返回Future的提交方法之一。 这允许您在将来的某个时间检查任务是否为isDone()
并通过get()
检索结果。 如果有exception, get()
将抛出它(包含在ExecutionException中)。 注意 – 即使你的Future没有“返回”任何东西(它是Void类型),调用get()
(忽略void结果)来测试Exception仍然是一个好习惯。
然而,这次检查未来有点鸡和蛋的问题。 线程池的重点是不阻塞地提交任务。 但是Future.get()阻塞了,Future.isDone()引出了哪个线程正在调用它的问题,以及如果它没有完成它会做什么 – 你睡觉()和阻塞吗?
如果你同时提交一组已知相关的任务 ,例如,你正在进行一些大的数学计算,比如可以并行完成的矩阵乘法,并且获得部分结果没有特别的优势,你可以调用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()); ...
class ScheduledThreadPoolExecutor
ThreadPoolExecutor
,可以额外调度命令在给定延迟后运行,或定期执行 。 当需要多个工作线程时,或者当需要ThreadPoolExecutor
(此类扩展)的额外灵活性或function时,此类优于Timer。
延迟任务在启用后立即执行,但没有任何实时保证,启用它们后何时启动它们。 按照first-in-first-out (FIFO)
提交顺序启用计划完全相同执行时间的任务。
和
接口ExecutorService
一个Executor
,提供管理终止的方法和可以生成Future的方法,用于跟踪一个或多个异步任务的进度 。
可以关闭ExecutorService
,这将导致它停止接受新任务。 关闭后,执行程序最终将终止,此时没有任务正在执行,没有任务正在等待执行,也没有任何新任务可以提交。
编辑:
您可以找到使用Executor
和ExecutorService
示例
这里
这里
在这里
问题对你有用。
- 如何在java中将String转换为Date
- 正则表达式具有量词
- 如何在MongoDB中更新特定文档的特定嵌入文档的值?
- Spring和Hibernate突然将事务设置为readonly
- NoClassDefFoundError:org / hibernate / annotations / common / reflection / MetadataProvider
- 具有多个webapps的tomcat ajp连接器
- 使用Surefire的Maven拒绝运行单一测试方法?
- Java exec – 交互过程的输出一直持续到进程终止
- 如何使用Arquillian测试登录/身份validation – Java EE 7