Semaphore
![](https://cdn.codegym.cc/images/article/5b56b330-d15d-450e-9d26-15f951f2a98a/1024.jpeg)
Semaphore biasanya digunakan apabila perlu untuk mengehadkan bilangan utas apabila bekerja dengan sistem fail. Akses kepada fail atau sumber kongsi lain dikawal melalui kaunter. Jika nilainya lebih besar daripada sifar, akses dibenarkan, tetapi pada masa yang sama kaunter akan berkurangan.
Pada masa apabila pembilang mengembalikan sifar, utas semasa akan disekat sehingga sumber dikeluarkan oleh utas lain. Bilangan parameter kebenaran mesti ditetapkan melalui pembina.
Anda perlu memilih parameter ini secara individu, bergantung pada kuasa komputer atau komputer riba anda.
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 dan lain-lain
CountDownLatch - Membenarkan berbilang utas menunggu sehingga bilangan operasi tertentu yang dilakukan pada utas lain telah selesai. Contohnya ialah pemasangan aplikasi: ia tidak akan bermula sehingga anda menerima syarat penggunaan, sehingga anda memilih folder untuk memasang program baharu, dan seterusnya. Terdapat kaedah countdown() khas untuk ini - kaedah ini mengurangkan kaunter kiraan turun sebanyak satu.
Sebaik sahaja kiraan menjadi sifar, semua urutan menunggu dalam penantian akan meneruskan kerja mereka, dan semua panggilan penantian seterusnya akan berlalu tanpa menunggu. Kaunter hitung mundur ialah kaunter sekali dan tidak boleh ditetapkan semula.
CyclicBarrier - digunakan untuk menyegerakkan bilangan benang tertentu pada satu titik. Halangan dicapai apabila N benang memanggil kaedah dan blok await(...). Selepas itu, kaunter ditetapkan semula kepada nilai asalnya, dan benang menunggu akan dikeluarkan. Selain itu, jika perlu, adalah mungkin untuk menjalankan kod tersuai sebelum menyahsekat benang dan menetapkan semula kaunter. Untuk melakukan ini, objek dengan pelaksanaan antara muka Runnable dihantar melalui pembina .
Exchanger<V> — kelas Exchanger bertujuan untuk pertukaran data antara benang. Ia ditaip dan menaip jenis data yang perlu ditukar oleh benang.
Data ditukar menggunakan satu-satunya kaedah exchange() kelas ini :
V exchange(V x) throws InterruptedException
V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException
Parameter x mewakili penimbal data yang akan ditukar. Bentuk kedua kaedah juga mentakrifkan parameter tamat masa , tamat masa dan unit , jenis unit masa untuk digunakan untuk parameter tamat masa .
Kelas Phaser membolehkan anda menyegerakkan benang yang mewakili satu fasa atau peringkat dalam pelaksanaan tindakan keseluruhan. Phaser mentakrifkan objek penyegerakan yang menunggu sehingga fasa tertentu telah selesai. Fasa kemudian bergerak ke peringkat atau fasa seterusnya dan menunggu ia selesai semula.
Apabila bekerja dengan kelas Phaser , adalah perkara biasa untuk mula-mula mencipta objeknya. Seterusnya, kita perlu mendaftar semua peserta. Untuk mendaftar bagi setiap peserta, kaedah register() dipanggil , atau anda boleh melakukannya tanpa kaedah ini dengan menghantar bilangan peserta yang diperlukan kepada pembina Phaser .
Kemudian setiap peserta melakukan set tindakan tertentu yang membentuk fasa. Dan penyegerak Phaser menunggu sehingga semua peserta menyelesaikan pelaksanaan fasa. Untuk memaklumkan penyegerak bahawa fasa telah tamat, peserta mesti memanggil kaedah arrive() atau arriveAndAwaitAdvance() . Penyegerak kemudian bergerak ke fasa seterusnya.