等待资源的线程

hsgswve4  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(306)

我有一个分配,其中有两个线程使用共享的单例类示例存储资源列表。当线程接收到事件时,他会尝试使用共享示例获取资源。一个资源是通过生成一个布尔字段来获取的,这个布尔字段表示他是否可以随意设置为false。问题是,如果一个线程正在使用另一个线程需要的资源,那么在等待第二个线程完成时,另一个线程将做什么?我所能想到的只是一个while循环,直到他获得了所需的所有资源才停止,但是它很忙,等待,我试着想一个不同的方法。

public class Thread1{
    private SharedObject sharedObject;
    public void acquire objects(List<Integer> indexes){
        for(int i=0;i<indexes.size;i++){
            sharedObject.acquire(indexes[i]);
        }
    }
}
 // I have another Thread which is implemented the same way
public class SharedObject{
   private List<SomeObject> someObjects;
   public synchronized void acquire(int index){
      someObjects[index].acquire();
   }
}
public class SomeObject{
   private boolean isFree = true;
   public void acquire(){
      isFree = False;
   }
}

因此,我的问题是,如果其中一个资源在我试图获取它们时已经在使用,该怎么办

8wigbo56

8wigbo561#

声明具有同步的“boolean resourcewait()”的singleton类,该方法必须由需要任何一组资源的线程调用,并且必须在线程完成某组资源时调用“resourcerelease()”。它还需要一个初始为空的等待资源的线程示例的“等待”列表。
声明一个线程类,该类公开资源的公共列表和一个“resourcesavailable()方法,该方法向私有信号量发出信号”。
在'resourcewait'单例锁中,线程可以检查它是否可以立即获得所有资源,如果可以,则将它们标记为正在使用,使用'true'退出synchro方法并继续运行。如果线程不能立即获得所有的资源,它可以将自己加载到等待列表中,用'false'退出synchro方法,然后等待它的私有信号量。
当线程调用release时,它会将资源标志设置为“free”,并迭代“waiting”列表,寻找现在可以获得所需资源的线程。如果找到一个,它将为等待线程的资源设置'in use'标志,在等待线程上调用'resourcesavailable'(向其信号量发送信号,从而将其设置为ready/running),并退出syncro。
没有繁忙的等待循环,没有死锁,易于扩展/修改,易于调试。

相关问题