Semafor
![](https://cdn.codegym.cc/images/article/5b56b330-d15d-450e-9d26-15f951f2a98a/1024.jpeg)
Semaforer brukes vanligvis når det er nødvendig å begrense antall tråder når du arbeider med filsystemet. Tilgang til en fil eller annen delt ressurs kontrolleres gjennom en teller. Hvis verdien er større enn null, tillates tilgang, men samtidig vil telleren synke.
I det øyeblikket telleren returnerer null, vil gjeldende tråd bli blokkert til ressursen frigjøres av en annen tråd. Parameteren for antall tillatelser må angis via konstruktøren.
Du må velge denne parameteren individuelt, avhengig av kraften til datamaskinen eller den bærbare datamaskinen.
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 og andre
CountDownLatch - Lar flere tråder vente til et visst antall operasjoner utført på andre tråder er fullført. Et eksempel er installasjonen av en applikasjon: den starter ikke før du godtar vilkårene for bruk, før du velger en mappe hvor du vil installere et nytt program, og så videre. Det er en spesiell countDown() -metode for dette - denne metoden reduserer telleren med én.
Så snart tellingen går til null, vil alle ventende tråder i vente fortsette arbeidet, og alle påfølgende anrop av venter vil passere uten å vente. Nedtellingstelleren er en engangsteller og kan ikke tilbakestilles.
CyclicBarrier - brukes til å synkronisere et gitt antall tråder på ett punkt. Barrieren nås når N tråder kaller await(...)-metoden og blokkerer. Etter det tilbakestilles telleren til sin opprinnelige verdi, og de ventende trådene vil bli frigitt. I tillegg, om nødvendig, er det mulig å kjøre tilpasset kode før du fjerner blokkering av tråder og tilbakestiller telleren. For å gjøre dette sendes et objekt med en implementering av Runnable- grensesnittet gjennom konstruktøren .
Exchanger<V> — Exchanger- klassen er beregnet for datautveksling mellom tråder. Det skrives og skriver inn typen data som trådene trenger å utveksle.
Data utveksles med den eneste exchange() -metoden for denne klassen :
V exchange(V x) throws InterruptedException
V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException
x-parameteren representerer databufferen som skal utveksles. Den andre formen av metoden definerer også tidsavbruddsparameteren , tidsavbruddet og enheten , typen tidsenhet som skal brukes for tidsavbruddsparameteren .
Phaser- klassen lar deg synkronisere tråder som representerer en enkelt fase eller trinn i utførelsen av en samlet handling. Phaser definerer et synkroniseringsobjekt som venter til en bestemt fase er fullført. Phaser går deretter videre til neste trinn eller fase og venter på at den skal fullføres igjen.
Når du arbeider med Phaser- klassen , er det vanlig å først lage objektet. Deretter må vi registrere alle deltakere. For å registrere deg for hver deltaker, kalles register()- metoden , eller du kan klare deg uten denne metoden ved å sende det nødvendige antallet deltakere til Phaser- konstruktøren .
Deretter utfører hver deltaker et bestemt sett med handlinger som utgjør fasen. Og Phaser- synkroniseringen venter til alle deltakerne har fullført utførelsen av fasen. For å informere synkronisatoren om at fasen er avsluttet, må deltakeren kalle arrive()- eller arriveAndAwaitAdvance()- metoden . Synkronisatoren går deretter videre til neste fase.