java信号量控制线程打印顺序的示例分享

Java信号量是一种同步原语,用于控制线程并发访问资源的数量。Java信号量的主要作用是保护临界区,以确保在任何时刻只有特定数量的线程可以访问该区域。在这里,我们将分享一个Java信号量控制线程打印顺序的示例,该示例演示如何使用Java信号量来协调多个线程以按特定顺序打印。

1. 示例一

在这个示例中,我们将创建两个线程,一个线程负责打印奇数,另一个线程负责打印偶数。我们将借助Java信号量来保证它们按照正确的顺序打印。下面是示例代码:

import java.util.concurrent.Semaphore;

public class PrintNumbers {
    private static final Semaphore semaphore = new Semaphore(1);
    private static int counter = 1;
    private static final Object lock = new Object();

    public static void main(String[] args) {

        Thread even = new Thread(() -> {
            while (counter <= 10) {
                try {
                    semaphore.acquire();
                    if (counter % 2 == 0) {
                        System.out.println(counter);
                        counter++;
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    semaphore.release();
                }
            }
        });

        Thread odd = new Thread(() -> {
            while (counter <= 10) {
                try {
                    semaphore.acquire();
                    if (counter % 2 != 0) {
                        System.out.println(counter);
                        counter++;
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    semaphore.release();
                }
            }
        });

        odd.start();
        even.start();
    }
}

在这个示例中,我们使用了两个线程,一个线程打印奇数,另一个线程打印偶数。我们使用Java信号量来确保它们交替打印。我们创建一个Semaphore对象,其构造函数中的参数是指定信号量允许的最大许可证数。在我们的示例中,我们将许可证数设置为1,这将确保每个线程以不同的顺序打印。

2. 示例二

在这个示例中,我们将演示如何使用无锁算法来实现Java信号量。我们将创建三个线程,其中一个线程将原子性地递增计数器,另外两个线程将轮流消耗信号量。下面是示例代码:

import java.util.concurrent.atomic.AtomicInteger;

public class SemaphoreExample2 {
    private static final AtomicInteger counter = new AtomicInteger(0);

    public static void main(String[] args) {

        Thread t1 = new Thread(() -> {
            try {
                while (true) {
                    counter.incrementAndGet();
                    Thread.sleep(1000);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        Thread t2 = new Thread(() -> {
            try {
                while (true) {
                    while (counter.get() >= 10) {
                        Thread.sleep(10);
                    }
                    counter.decrementAndGet();
                    System.out.println("Thread 2 acquired the semaphore.");
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        Thread t3 = new Thread(() -> {
            try {
                while (true) {
                    while (counter.get() < 10) {
                        Thread.sleep(10);
                    }
                    counter.decrementAndGet();
                    System.out.println("Thread 3 acquired the semaphore.");
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        t1.start();
        t2.start();
        t3.start();
    }
}

在这个示例中,我们使用了无锁算法来实现Java信号量。我们创建了一个AtomicInteger对象,其初始值为0,这将用于记录计数器的状态。我们同时创建了三个线程,其中一个线程负责递增计数器,另外两个线程将轮流消耗信号量。在线程2和线程3中,我们使用while循环来等待特定的条件满足,然后再使用counter.decrementAndGet()来递减计数器,这将意味着这个线程获取了信号量。在最后,这些线程将轮流打印“Thread 2 acquired the semaphore.”和“Thread 3 acquired the semaphore.”。

总之,这两个示例展示了如何使用Java信号量来协调多个线程并按顺序打印。第一个示例演示了如何使用Semaphore对象来交替打印奇数和偶数,第二个示例演示了无锁算法如何实现信号量。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java信号量控制线程打印顺序的示例分享 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • java 非对称加密算法DH实现详解

    Java 非对称加密算法 DH 实现详解 什么是 DH 算法 DH(Diffie-Hellman)算法是一种基于数学问题的密钥交换协议,旨在让通信双方在不将真正的密钥送出的情况下,各自生成具有相同密钥的方法。DH 算法主要用于加密通信和加密存储,其最大的优点在于,即使密文被截获,攻击者也无法破解密文,从而保证通信安全性。 DH 算法详解 密钥交换流程 DH …

    Java 2023年5月19日
    00
  • Java中的字节,字符输出流与字节和字符输入流的简单理解

    Java中的 IO 流可以分为字节流和字符流。字节流以字节(8 位二进制数)为单位,而字符流以字符为单位,每个字符包含若干个字节。Java 中字符采用 Unicode 编码,每个字符占 2 个字节。 在 Java 中,字节输出流有两个主要的类:OutputStream 和 FileOutputStream。OutputStream 是字节输出流的抽象基类,可…

    Java 2023年5月26日
    00
  • JSP中param动作的实例详解

    当我们想要把参数传递给 JSP 页面时,param 动作是一种非常有用的方法。通过在 JSP 页面中使用 param 动作,我们可以轻松地向页面中传递参数,这些参数可以来自域对象,例如 request、session 或 application,也可以来源于页面 URL 中的查询字符串或表单提交。本文将为大家深入详解 param 动作的用法,通过两个实例帮助…

    Java 2023年6月15日
    00
  • 在CentOS系统中检测Java安装及运行jar应用的方法

    在CentOS系统中检测Java安装及运行jar应用的方法: 1. 检测Java是否安装 可以通过以下命令检查Java是否安装在系统中: java -version 如果Java已经安装在系统中,会输出类似以下内容的信息: java version "1.8.0_191" Java(TM) SE Runtime Environment (…

    Java 2023年5月23日
    00
  • Mybatis实现动态SQL编写详细代码示例

    针对”Mybatis实现动态SQL编写详细代码示例”这个话题,我为您提供以下完整攻略。 前言 在Mybatis中,动态SQL是非常强大和常用的功能。通过动态SQL可以根据输入参数的不同来生成不同的SQL语句,从而实现更加灵活的数据查询和操作。Mybatis提供了多种动态SQL的方式,如if/where/set/foreach等。本文将详细介绍Mybatis实…

    Java 2023年5月19日
    00
  • 使用Java接入小程序订阅消息!

    更新完微信服务号的模板消息之后,我又赶紧把微信小程序的订阅消息给实现了!之前我一直以为微信小程序也是要企业才能申请,没想到小程序个人就能申请。 消息推送平台?推送下发【邮件】【短信】【微信服务号】【微信小程序】【企业微信】【钉钉】等消息类型。 https://gitee.com/zhongfucheng/austin/ https://github.com/…

    Java 2023年4月19日
    00
  • java发起http请求获取返回的Json对象方法

    以下是Java发起HTTP请求获取返回的JSON对象的详细攻略: 第一步:引入依赖 在进行HTTP请求之前,需要先引入相关的依赖。这里,我们需要引入以下两个库: <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpc…

    Java 2023年5月26日
    00
  • 基于Java Tomcat和激活MyEclips的深入理解

    基于Java Tomcat和激活MyEclipse的深入理解攻略 1. 安装Java Tomcat Java Tomcat是一款开源的Web服务器,支持Servlet和JavaServer Pages(JSP)技术。安装Java Tomcat十分简单,我们只需要到官网下载页面,下载我们需要的版本,然后解压即可。 2. 激活MyEclipse MyEclips…

    Java 2023年6月2日
    00
合作推广
合作推广
分享本页
返回顶部