java信号量和countdownlatch怎么操作

Java中的信号量(Semaphore)和CountDownLatch是两种常用的同步工具,它们都可以用于控制多个线程之间的并发执行,本文将详细介绍这两种同步工具的使用方法。

头屯河网站制作公司哪家好,找创新互联建站!从网页设计、网站建设、微信开发、APP开发、响应式网站等网站项目制作,到程序开发,运营维护。创新互联建站公司2013年成立到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联建站

信号量(Semaphore)

信号量是一个计数器,用于管理一组资源,它是一个整数变量,表示可用资源的数目,当一个线程需要使用资源时,它会尝试获取信号量,如果信号量的值大于0,那么线程就获得一个资源并继续执行;否则,线程将被阻塞,直到其他线程释放资源。

1、创建信号量

要创建一个信号量,可以使用java.util.concurrent.Semaphore类,构造函数接受一个整数参数,表示初始可用资源的数量。

import java.util.concurrent.Semaphore;
public class SemaphoreExample {
    public static void main(String[] args) {
        Semaphore semaphore = new Semaphore(3); // 创建一个初始可用资源为3的信号量
    }
}

2、获取和释放资源

要获取一个资源,可以使用acquire()方法,这个方法会阻塞当前线程,直到信号量的值大于0。

semaphore.acquire(); // 获取一个资源

要释放一个资源,可以使用release()方法,这个方法会增加信号量的值。

semaphore.release(); // 释放一个资源

3、示例

下面是一个使用信号量的示例,它创建了两个线程,分别打印奇数和偶数,我们使用信号量来限制同时访问共享资源的线程数量。

import java.util.concurrent.Semaphore;
public class SemaphoreExample {
    public static void main(String[] args) throws InterruptedException {
        Semaphore semaphore = new Semaphore(1); // 创建一个初始可用资源为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("奇数:" + 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("偶数:" + count);
                count += 2;
                semaphore.release(); // 释放信号量,允许其他线程访问共享资源
                semaphore.acquire(); // 再次获取信号量,确保只有一个线程可以访问共享资源
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            semaphore.release(); // 最后释放信号量,确保所有线程都可以访问共享资源
        }
    }
}

CountDownLatch(倒计时锁存器)

CountDownLatch是一个同步辅助类,它允许一个或多个线程等待其他线程完成操作,它的主要方法是countDown()await()countDown()方法用于减少倒计时锁存器的计数值,而await()方法用于等待倒计时锁存器的计数值为0,当计数值为0时,所有等待的线程将被唤醒,倒计时锁存器的计数值只能被初始化一次,且之后不能被重置,如果需要重置计数值,可以创建一个新的倒计时锁存器对象。

1、创建CountDownLatch对象:CountDownLatch(int count),其中count是倒计时锁存器的初始计数值,创建一个初始计数值为3的倒计时锁存器:CountDownLatch countDownLatch = new CountDownLatch(3);

网页标题:java信号量和countdownlatch怎么操作
分享路径:http://www.shufengxianlan.com/qtweb/news23/212823.html

成都网站建设公司_创新互联,为您提供微信小程序网站导航建站公司虚拟主机全网营销推广网站维护

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联