繁体   English   中英

Java资源池线程问题

[英]Java Resource Pool Threading issue

我在高性能环境中遇到问题,可以在散文中描述如下:

我有一个外部Java API,该API可以调用具有64个资源的FPGA卡。 我需要一种机制来在应用程序的数百个线程之间安全地共享那些资源的子集。 每个资源都应被视为不是线程安全的。

因此,我需要一个带有方法update()的ResourcePool,然后再调用resource.update()。

我认为这是一个相当普遍的习惯用法,但是我很难适应Java概念。 我想说一个ResourcePool中有4种资源。 我每个人都应该住在自己的线程中(因此需要一个线程池)。

我将如何实现这一点,以便在使用所有4种资源时记录错误并继续进行操作?

希望这有道理!

我将代表每个资源的对象放入LinkedBlockingQueue。

要获取资源,您可以根据需要轮询(),remove()或take()。

要返回资源,您可以添加它。

只要每个线程仅需要一个资源,就可以使用@Peter建议的使用LinkedBlockingQueue来池化资源。 如果多个线程需要一个以上的线程,那么在简单的情况下,如果多个线程已经获取了一些资源,但还不足以使它们中的任何一个继续进行,则可能会出现问题-死锁。

您可以使用由一个锁保护的两个队列。 一个资源实例的“池”队列,一个线程实例的“等待”队列等待获取资源。 线程类的方法返回其当前正在等待的资源数。

任何需要资源的线程都将获取该锁,并首先检查池队列计数。 如果有足够的资源,它将使它们出队并退出锁。 如果没有足够的空间,它将自动进入等待队列,退出锁并等待。

任何可以释放其资源的线程都将获得该锁。 如果等待队列为空,则将资源释放回池中,释放锁并退出。 如果等待队列不为空,则对其进行迭代,从而构建一组等待线程,可以将等待释放的资源与池中剩余的资源之和准备就绪。 然后,它应用某种算法来确定可以准备哪些等待线程。 如果不存在,它将仅将资源释放回池并退出锁定。 如果有一个,它将用资源加载那些线程,通知它们,释放锁并退出。

对于BlockingQueue,它对于生产者-消费者模式非常有用,您必须按用户要求在此资源之后更新或添加它,但是资源的初始化性能很差。 而且这是一个阻塞队列,如果您想在池为空或满时处理一些信息,则可以使用Queue。

对于锁定,如果这些资源已初始化并且之后没有更改,则向这些资源添加锁定更好。

这是我的意见。

由于您基本上可以将某些东西视为有限数量的通用资源,因此可以应用任何通用资源池库。 Google首次将pool4j返回,这可能就是您所需要的。 它基于java.util.Stack 或者,您可以推出自己的解决方案。

暂无
暂无

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

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