Semafor

Semaforer används vanligtvis när det är nödvändigt att begränsa antalet trådar när man arbetar med filsystemet. Tillgång till en fil eller annan delad resurs styrs genom en räknare. Om dess värde är större än noll tillåts åtkomst, men samtidigt minskar räknaren.

I det ögonblick då räknaren returnerar noll kommer den aktuella tråden att blockeras tills resursen släpps av en annan tråd. Parametern för antal behörigheter måste ställas in via konstruktorn.

Du måste välja denna parameter individuellt, beroende på kraften på din dator eller bärbara dator.

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 och andra

CountDownLatch - Låter flera trådar vänta tills ett visst antal operationer som utförs på andra trådar har slutförts. Ett exempel är installationen av en applikation: den startar inte förrän du accepterar användarvillkoren, förrän du väljer en mapp där ett nytt program ska installeras och så vidare. Det finns en speciell countDown()- metod för detta - den här metoden minskar nedräkningsräknaren med ett.

Så snart räkningen går till noll kommer alla väntande trådar i väntan att fortsätta sitt arbete, och alla efterföljande väntande samtal kommer att passera utan att vänta. Nedräkningsräknaren är en engångsräknare och kan inte återställas.

CyclicBarrier - används för att synkronisera ett givet antal trådar vid en punkt. Barriären nås när N trådar anropar await(...)-metoden och blockerar. Därefter återställs räknaren till sitt ursprungliga värde, och de väntande trådarna kommer att släppas. Dessutom, om det behövs, är det möjligt att köra anpassad kod innan du avblockerar trådar och nollställer räknaren. För att göra detta skickas ett objekt med en implementering av Runnable- gränssnittet genom konstruktorn .

Exchanger<V> Exchanger -klassen är avsedd för datautbyte mellan trådar. Det skrivs och skriver den typ av data som trådarna behöver utbyta.

Data utbyts med den enda exchange() -metoden för denna klass :

V exchange(V x) throws InterruptedException
V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException

Parametern x representerar databufferten som ska utbytas. Den andra formen av metoden definierar också timeout -parametern , timeout och enhet , vilken typ av tidsenhet som ska användas för timeout -parametern .

Phaser -klassen låter dig synkronisera trådar som representerar en enskild fas eller steg i utförandet av en övergripande åtgärd. Phaser definierar ett synkroniseringsobjekt som väntar tills en viss fas har slutförts. Phasern går sedan vidare till nästa steg eller fas och väntar på att den ska slutföras igen.

När man arbetar med Phaser -klassen är det vanligt att man först skapar dess objekt. Därefter måste vi registrera alla deltagare. För att registrera dig för varje deltagare kallas register() -metoden , eller så kan du klara dig utan denna metod genom att skicka det nödvändiga antalet deltagare till Phaser- konstruktorn .

Sedan utför varje deltagare en viss uppsättning åtgärder som utgör fasen. Och Phaser- synkroniseraren väntar tills alla deltagare har slutfört exekveringen av fasen. För att informera synkroniseraren om att fasen har avslutats måste deltagaren anropa metoden arrive() eller arriveAndAwaitAdvance() . Synkroniseraren går sedan vidare till nästa fas.