Как позволить другим потокам продолжить блокировку элементов внутри для цикла Java - PullRequest
0 голосов
/ 14 октября 2018

Допустим, у меня есть код ниже

public class ContinueIfCannotLock implements Runnable
{

static List<LockingObject> lockObjects = new ArrayList();
@Override
   public void run()
   {
       for(LockingObject obj : lockObjects)
       {
           synchronized ( obj )
           {
            // do things here
           }
       }

   }

}

, а объект LockingObject является просто и пустым классом.Также предположим, что перед запуском этих потоков у нас есть 100 объектов в списке LockingObject.Итак, как я могу позволить потоку перейти к следующему объекту в списке, если он не может получить блокировку для текущего элемента.Так что никакой поток (по крайней мере, пока все объекты не заблокированы потоком) не ожидает внутри цикла.

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

Попробуйте использовать Thread.holdsLock(Object obj),

Возвращает true, если и только если текущий поток удерживает блокировку монитора для указанного объекта.

~ Thread(Java Platform SE 8) ~


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
           }
       }
   }
}
0 голосов
/ 14 октября 2018

Вы можете использовать блокировки:

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 потоков, вы также можете использовать Semaphore, который является блокировкой, котораядавайте несколько потоков заблокируем его до указанного значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...