新聞中心
Java中的信號量(Semaphore)和CountDownLatch是兩種常用的同步工具,它們都可以用于控制多個線程之間的并發(fā)執(zhí)行,本文將詳細介紹這兩種同步工具的使用方法。

頭屯河網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)建站!從網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、APP開發(fā)、響應式網(wǎng)站等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)建站公司2013年成立到現(xiàn)在10年的時間,我們擁有了豐富的建站經驗和運維經驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設就選創(chuàng)新互聯(lián)建站。
信號量(Semaphore)
信號量是一個計數(shù)器,用于管理一組資源,它是一個整數(shù)變量,表示可用資源的數(shù)目,當一個線程需要使用資源時,它會嘗試獲取信號量,如果信號量的值大于0,那么線程就獲得一個資源并繼續(xù)執(zhí)行;否則,線程將被阻塞,直到其他線程釋放資源。
1、創(chuàng)建信號量
要創(chuàng)建一個信號量,可以使用java.util.concurrent.Semaphore類,構造函數(shù)接受一個整數(shù)參數(shù),表示初始可用資源的數(shù)量。
import java.util.concurrent.Semaphore;
public class SemaphoreExample {
public static void main(String[] args) {
Semaphore semaphore = new Semaphore(3); // 創(chuàng)建一個初始可用資源為3的信號量
}
}
2、獲取和釋放資源
要獲取一個資源,可以使用acquire()方法,這個方法會阻塞當前線程,直到信號量的值大于0。
semaphore.acquire(); // 獲取一個資源
要釋放一個資源,可以使用release()方法,這個方法會增加信號量的值。
semaphore.release(); // 釋放一個資源
3、示例
下面是一個使用信號量的示例,它創(chuàng)建了兩個線程,分別打印奇數(shù)和偶數(shù),我們使用信號量來限制同時訪問共享資源的線程數(shù)量。
import java.util.concurrent.Semaphore;
public class SemaphoreExample {
public static void main(String[] args) throws InterruptedException {
Semaphore semaphore = new Semaphore(1); // 創(chuàng)建一個初始可用資源為1的信號量
Thread oddThread = new Thread(new PrintOddNumbers(semaphore));
Thread evenThread = new Thread(new PrintEvenNumbers(semaphore));
oddThread.start();
evenThread.start();
oddThread.join();
evenThread.join();
}
}
class PrintOddNumbers implements Runnable {
private Semaphore semaphore;
private int count = 1;
public PrintOddNumbers(Semaphore semaphore) {
this.semaphore = semaphore;
}
@Override
public void run() {
try {
semaphore.acquire(); // 獲取信號量,確保只有一個線程可以訪問共享資源
while (count <= 10) {
System.out.println("奇數(shù):" + count);
count += 2;
semaphore.release(); // 釋放信號量,允許其他線程訪問共享資源
semaphore.acquire(); // 再次獲取信號量,確保只有一個線程可以訪問共享資源
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release(); // 最后釋放信號量,確保所有線程都可以訪問共享資源
}
}
}
class PrintEvenNumbers implements Runnable {
private Semaphore semaphore;
private int count = 2;
public PrintEvenNumbers(Semaphore semaphore) {
this.semaphore = semaphore;
}
@Override
public void run() {
try {
semaphore.acquire(); // 獲取信號量,確保只有一個線程可以訪問共享資源
while (count <= 10) {
System.out.println("偶數(shù):" + count);
count += 2;
semaphore.release(); // 釋放信號量,允許其他線程訪問共享資源
semaphore.acquire(); // 再次獲取信號量,確保只有一個線程可以訪問共享資源
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release(); // 最后釋放信號量,確保所有線程都可以訪問共享資源
}
}
}
CountDownLatch(倒計時鎖存器)
CountDownLatch是一個同步輔助類,它允許一個或多個線程等待其他線程完成操作,它的主要方法是countDown()和await()。countDown()方法用于減少倒計時鎖存器的計數(shù)值,而await()方法用于等待倒計時鎖存器的計數(shù)值為0,當計數(shù)值為0時,所有等待的線程將被喚醒,倒計時鎖存器的計數(shù)值只能被初始化一次,且之后不能被重置,如果需要重置計數(shù)值,可以創(chuàng)建一個新的倒計時鎖存器對象。
1、創(chuàng)建CountDownLatch對象:CountDownLatch(int count),其中count是倒計時鎖存器的初始計數(shù)值,創(chuàng)建一個初始計數(shù)值為3的倒計時鎖存器:CountDownLatch countDownLatch = new CountDownLatch(3);。
當前題目:java信號量和countdownlatch怎么操作
網(wǎng)站地址:http://www.dlmjj.cn/article/dhsjeds.html


咨詢
建站咨詢
