Semaphore

Semaphore biasane digunakake nalika perlu kanggo mbatesi jumlah utas nalika nggarap sistem file. Akses menyang file utawa sumber daya sing dienggo bareng liyane dikontrol liwat counter. Yen nilai luwih saka nul, akses diijini, nanging ing wektu sing padha counter bakal suda.

Ing wayahe nalika counter ngasilake nol, utas saiki bakal diblokir nganti sumber daya dirilis dening utas liyane. Jumlah parameter ijin kudu disetel liwat konstruktor.

Sampeyan kudu milih parameter iki kanthi individu, gumantung saka daya komputer utawa 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 lan liya-liyane

CountDownLatch - Ngidini sawetara utas ngenteni nganti sawetara operasi tartamtu sing ditindakake ing utas liyane wis rampung. Conto yaiku instalasi aplikasi: ora bakal diwiwiti nganti sampeyan nampa syarat panggunaan, nganti sampeyan milih folder kanggo nginstal program anyar, lan liya-liyane. Ana cara countDown khusus () kanggo iki - cara iki nyuda count mudhun counter dening siji.

Sanalika count dadi nol, kabeh utas nunggu ing nunggu bakal nerusake karya, lan kabeh telpon nunggu sakteruse bakal liwati tanpa nunggu. Countdown count minangka counter siji-wektu lan ora bisa direset.

CyclicBarrier - digunakake kanggo nyinkronake sawetara utas ing sawijining titik. Rintangan tekan nalika benang N nelpon metode lan pamblokiran await(...). Sawise iku, counter direset menyang nilai asline, lan benang tunggu bakal dirilis. Kajaba iku, yen perlu, sampeyan bisa mbukak kode khusus sadurunge mbukak blokir benang lan ngreset counter. Kanggo nindakake iki, obyek kanthi implementasi antarmuka Runnable dilewati konstruktor .

Exchanger<V> kelas Exchanger dimaksudaké kanggo ijol-ijolan data antarane thread. Iki diketik lan ketik jinis data sing kudu diijolake benang.

Data diijolke nggunakake mung exchange() metode kelas iki :

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

Parameter x nggambarake buffer data sing bakal diijolke. Cara liya uga nemtokake parameter wektu entek , wektu entek , lan unit , jinis unit wektu sing digunakake kanggo parameter wektu entek .

Kelas Phaser ngidini sampeyan nyinkronake benang sing makili fase utawa tahap siji ing eksekusi tumindak sakabèhé. Phaser nemtokake obyek sinkronisasi sing ngenteni nganti fase tartamtu wis rampung. Phaser banjur pindhah menyang tahap utawa fase sabanjure lan ngenteni rampung maneh.

Nalika nggarap kelas Phaser , umume nggawe obyek kasebut. Sabanjure, kita kudu ndhaptar kabeh peserta. Kanggo ndhaftar saben peserta, ndhaftar () cara disebut , utawa sampeyan bisa nindakake tanpa cara iki dening pass nomer peserta dibutuhake kanggo konstruktor Phaser .

Banjur saben peserta nindakake sakumpulan tumindak tartamtu sing nggawe fase kasebut. Lan sinkronisasi Phaser ngenteni nganti kabeh peserta wis ngrampungake eksekusi fase kasebut. Kanggo ngandhani sinkronisasi yen fase wis rampung, peserta kudu nelpon cara arrive () utawa arriveAndAwaitAdvance () . Sinkronisasi banjur pindhah menyang fase sabanjure.