2 回答
TA贡献1851条经验 获得超4个赞
尝试使用Thread.holdsLock(Object obj),
当且仅当当前线程持有指定对象的监视器锁时,才返回 true。
static List<LockingObject> lockObjects = new ArrayList();
@Override
public void run(){
for(LockingObject obj : lockObjects){
if(Thread.holdsLock(obj)){
continue; //continue the loop if object is locked.
}
synchronized(obj){
// do things here
}
}
}
}
TA贡献1790条经验 获得超9个赞
您可以使用锁:
static List<ReentrantLock> lockObjects;
public static void init(){
lockObjects = new ArrayList<>(100);
for(int i = 0; i<100;i++){
lockObjects.add(new ReentrantLock());
}
}
@Override
public void run()
{
for(LockingObject lock : lockObjects)
{
if(lock.tryLock()){
try{
//dostuff
}finally{
lock.unlock();
}
// break if you only want the thread to work once
break;
}
}
}
如果您的唯一目标是让最多 100 个线程同时工作,您还可以使用 aSemaphore这是一个锁,让多个线程将其锁定到指定值。
添加回答
举报