我在高性能环境中遇到了一个问题,可以用散文来描述:
我有一个外部Java API,它调用一个包含64个资源的FPGA卡。我需要一种机制来在应用程序中的数百个线程之间安全地共享这些资源的子集。每个资源都应该被认为不是线程安全的。
所以我需要一个带有ResourcePool ()方法的更新,然后调用resource.update()。
我认为这是一个相当常见的习惯用法,但我很难适应Java的概念。我想说在一个ResourcePool中拥有4个资源。我猜每个线程都应该存在于自己的线程中(所以需要一个线程池)。
我如何实现它,以便在所有4个资源都在使用的情况下记录错误并继续?
希望这是有意义的!
发布于 2012-10-11 11:36:38
对于BlockingQueue来说,生产者-消费者模式是非常有用的,你必须通过userd在该资源之后更新或添加它,但可能资源的初始化性能较差。而且它是一个阻塞队列,如果你想在池为空或满的时候处理一些信息,queue是可以的。
对于锁,如果这些资源是初始化的,并且在初始化后没有更改,则向这些资源添加锁更好。
这是我的观点。
发布于 2012-10-10 23:43:10
我会将一个表示每个资源的对象放入一个LinkedBlockingQueue中。
要获取资源,您可以根据自己的喜好使用poll()、remove()或take()。
要返回资源,您可以添加它。
发布于 2012-10-11 00:14:24
根据@Peter的建议,只要每个线程只需要一个资源,就可以使用LinkedBlockingQueue来汇集资源。如果多个线程需要一个以上的资源,那么在简单的情况下,当多个线程已经获得了一些资源,但不足以让它们中的任何一个继续执行时,就会出现问题--死锁。
您可以使用由一个锁保护的两个队列。一个资源实例的‘池’队列,一个等待获取资源的线程实例的‘等待’队列。thread类的方法返回它当前正在等待的资源数量。
任何需要资源的线程都会获取锁,并首先检查池队列计数。如果有足够的资源,它会将它们从队列中取出并退出锁。如果没有足够的锁,它会将自己排在等待队列中,退出锁并等待。
任何可以释放其资源的线程都会获得锁。如果等待队列为空,它会将资源释放回池,释放锁并退出。如果等待队列不是空的,它会迭代它,构建一组等待线程,这些线程可以用等待释放的资源和池中剩余的资源之和准备就绪。然后,它应用某种算法来决定哪些等待线程可以准备就绪。如果没有,它只是将资源释放回池并退出锁。如果有,它会用资源加载这些线程,通知它们,释放锁并退出。
https://stackoverflow.com/questions/12823056
复制相似问题