Java资源池线程问题

时间:2012-10-10 15:31:02

标签: java multithreading

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

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

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

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

我将如何实现这一点,以便我可以记录错误并在所有4个资源都在使用时继续?

希望这是有道理的!

4 个答案:

答案 0 :(得分:3)

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

要获取资源,您可以根据需要使用poll(),remove()或take()。

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

答案 1 :(得分:2)

只要每个线程只需要一个资源,使用LinkedBlockingQueue来汇集资源(如@Peter所建议的那样)就可以了。如果许多线程需要多个线程,那么在许多线程获得某些资源但又不足以让它们中的任何一个继续进行时,可能会出现问题 - 死锁。

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

任何需要资源的线程都会获取锁并首先检查池队列计数。如果有足够的资源,它会将它们出列并退出锁定。如果没有足够的,它会在等待队列上排队,退出锁并等待..

任何可以释放其资源的线程都会获得锁定。如果等待队列为空,则将资源释放回池中,释放锁并退出。如果等待队列不是空的,它会对它进行迭代,构建一组等待线程,这些线程可以通过等待释放的资源和池中剩余的资源之和来做好准备。然后它应用某种算法来决定哪些等待线程可以准备好。如果没有,它只是将资源释放回池并退出锁。如果有的话,它会用资源加载这些线程,通知它/它们,释放锁定并退出。

答案 2 :(得分:1)

对于BlockingQueue,它对于生产者 - 消费者模式非常有用,你必须在userd之后更新或添加它,但是资源的初始化可能是性能不佳的。它是一个阻塞队列,如果你想在池空或满时处理一些信息,Queue就可以了。

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

这是我的意见。

答案 3 :(得分:0)

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