Semafoor
Semaforen worden meestal gebruikt wanneer het nodig is om het aantal threads te beperken bij het werken met het bestandssysteem. Toegang tot een bestand of andere gedeelde bron wordt gecontroleerd via een teller. Als de waarde groter is dan nul, is toegang toegestaan, maar tegelijkertijd zal de teller dalen.
Op het moment dat de teller nul teruggeeft, wordt de huidige thread geblokkeerd totdat de bron wordt vrijgegeven door een andere thread. De parameter aantal rechten moet worden ingesteld via de constructor.
U moet deze parameter afzonderlijk selecteren, afhankelijk van de kracht van uw computer of laptop.
public class Main {
public static void main(String[] args) {
Semaphore sem = new Semaphore(1);
CommonResource res = new CommonResource();
new Thread(new MyThread(res, sem, "MyThread_1")).start();
new Thread(new MyThread(res, sem, "MyThread_2")).start();
new Thread(new MyThread(res, sem, "MyThread_3")).start();
}
}
class CommonResource {
int value = 0;
}
class MyThread implements Runnable {
CommonResource commonResource;
Semaphore semaphore;
String name;
MyThread(CommonResource commonResource, Semaphore sem, String name) {
this.commonResource = commonResource;
this.semaphore = sem;
this.name = name;
}
public void run() {
try {
System.out.println(name + "waiting permission");
semaphore.acquire();
commonResource.value = 1;
for (int i = 1; i < 7; i++) {
System.out.println(this.name + ": " + commonResource.value);
commonResource.value++;
Thread.sleep(150);
}
} catch (InterruptedException e) {
System.out.println(e.getMessage() + " " + name);
Thread.currentThread().interrupt();
}
System.out.println(name + "releases permission");
semaphore.release();
}
}
CountDownLatch en anderen
CountDownLatch - Hiermee kunnen meerdere threads wachten totdat een bepaald aantal bewerkingen op andere threads is voltooid. Een voorbeeld is de installatie van een applicatie: deze start pas als u de gebruiksvoorwaarden accepteert, als u een map selecteert waar u een nieuw programma wilt installeren, enzovoort. Hiervoor is een speciale methode countDown() - deze methode verlaagt de aftelteller met één.
Zodra de telling naar nul gaat, zullen alle wachtende threads in de wacht hun werk voortzetten, en alle volgende wachtende oproepen zullen doorgaan zonder te wachten. De aftelteller is een eenmalige teller en kan niet worden gereset.
CyclicBarrier - gebruikt om een bepaald aantal threads op één punt te synchroniseren. De barrière wordt bereikt wanneer N threads de wait(...) methode en block aanroepen. Daarna wordt de teller teruggezet naar de oorspronkelijke waarde en worden de wachtende threads vrijgegeven. Bovendien is het, indien nodig, mogelijk om aangepaste code uit te voeren voordat threads worden gedeblokkeerd en de teller wordt gereset. Om dit te doen, wordt een object met een implementatie van de Runnable- interface door de constructor geleid .
Exchanger<V> — de Exchanger- klasse is bedoeld voor gegevensuitwisseling tussen threads. Het is getypt en typt het type gegevens dat de threads moeten uitwisselen.
Gegevens worden uitgewisseld met de enige methode exchange() van deze klasse :
V exchange(V x) throws InterruptedException
V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException
De parameter x vertegenwoordigt de gegevensbuffer die moet worden uitgewisseld. De tweede vorm van de methode definieert ook de timeoutparameter , de timeout en unit , het type tijdseenheid dat moet worden gebruikt voor de timeoutparameter .
Met de klasse Phaser kunt u threads synchroniseren die een enkele fase of fase in de uitvoering van een algemene actie vertegenwoordigen. Phaser definieert een synchronisatieobject dat wacht tot een bepaalde fase is voltooid. De Phaser gaat dan verder naar de volgende fase of fase en wacht tot deze weer voltooid is.
Bij het werken met de Phaser- klasse is het gebruikelijk om eerst het object te maken. Vervolgens moeten we alle deelnemers registreren. Om voor elke deelnemer te registreren, wordt de methode register() aangeroepen , of u kunt deze methode achterwege laten door het vereiste aantal deelnemers door te geven aan de Phaser- constructor .
Vervolgens voert elke deelnemer een bepaalde reeks acties uit die deel uitmaken van de fase. En de Phaser- synchronisator wacht totdat alle deelnemers de uitvoering van de fase hebben voltooid. Om de synchronisator te informeren dat de fase is beëindigd, moet de deelnemer de methode arrive() of arriveAndAwaitAdvance() aanroepen . De synchronisator gaat dan verder naar de volgende fase.
GO TO FULL VERSION