Die Klasse ReentrantLock bietet eine feinere Kontrolle als das Schlüsselwort synchronized
, da mehrere Wartesets pro Objekt zulässig sind.
Sie können mehrere Conditions von einem mit ReentrantLock.newCondition()
erhalten. Ein Thread kann dann Condition.await()
aufrufen (ähnlich in Funktion zu Object.wait()
) und wird blockieren, bis ein anderer Thread Condition.signal()
aufruft (ähnlich in Funktion zu Object.notify()
).
Der Unterschied ist, dass Sie mehrere Conditions
für eine einzelne ReentrantLock
erstellen können. So können Sie einen Condition
für jeden Thread
erstellen und signal()
auf der Bedingung aufrufen, die der Thread
entspricht, die Sie aufwachen wollten.
Hier ist ein einfacher Beispielcode, der das oben genannte demonstriert. Es erzeugt 5 Threads
, die alle auf unterschiedliche Conditions
derselben ReentrantLock
warten. Der Haupt-Thread ruft dann signal()
auf, um einen bestimmten der Threads
aufzuwecken.
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class ReentranLockTest
{
public static void main(String[] args)
{
final ReentrantLock lock = new ReentrantLock();
int numThreads = 5;
Condition[] conditions = new Condition[numThreads];
// start five threads, storing their associated Conditions
for (int i = 0; i < numThreads; i++)
{
final int threadNumber = i;
System.out.printf("Started thread number %d%n", threadNumber);
// to create a Condition we must lock the associated ReentrantLock
lock.lock();
try
{
final Condition condition = lock.newCondition();
conditions[i] = condition;
// start the worker Thread
(new Thread()
{
@Override
public void run()
{
// wait on the Condition
// to do so we must be holding the
// associated ReentrantLock
lock.lock();
try
{
condition.await();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
finally
{
lock.unlock();
}
// print something when signal()
// is called on our Condition
System.out.printf("Thread number %d woke up!%n", threadNumber);
}
}).start();
}
finally
{
lock.unlock();
}
}
// acquire the ReentrantLock and call
// Condition.signal() to wake up Thread number 3
lock.lock();
try
{
System.out.printf("Waking up Thead number %d%n", 3);
conditions[3].signal();
}
finally
{
lock.unlock();
}
}
}
Dies sollte drucken folgendes:
Started Garnnummer 0
Started Garnnummer 1
Started Garnnummer 2
Started Garnnummer 3
Gestartet Thread-Nummer 4
Aufwachen Thead Nummer 3
Thema Nummer 3 aufgewacht!
Hallo Vielen Dank, könnten Sie bitte ein kleines Programm zeigen, das das Verständnis klarer macht ... Danke im Voraus ..! 1 – Neera
@ user1334074: Bitte akzeptieren Sie eine Antwort und machen Sie Ihre Arbeit. – Jayan
@ user1334074 Die Antwort scheint mir vollkommen klar zu sein. Jeder kompetente Java-Programmierer sollte in der Lage sein, das in Code umzuwandeln. – EJP