采用java信号量(semaphore)让线程轮流打印

semaphore是java.util.concurrent包下的并发工具类。

A counting semaphore. Conceptually, a semaphore maintains a set of permits. Each acquire() blocks if necessary until a permit is available, and then takes it. Each release() adds a permit, potentially releasing a blocking acquirer. However, no actual permit objects are used; the semaphore just keeps a count of the number available and acts accordingly.

Semaphores are often used to restrict the number of threads than can access some (physical or logical) resource.

大致意思是semaphore可以持有许可证,可以在初始化时指定,执行一次acquire(),获取一个许可证,线程进入,当许可证为0,则不再允许线程进入,执行一次release释放一个许可证。

package com.smikevon.concurrent.tools;

import java.util.Random;
import java.util.concurrent.Semaphore;

/**
 * @description: 有A,B,C三个线程, A线程输出A, B线程输出B, C线程输出C.要求, 同时启动三个线程, 按顺序输出ABC, 循环10次
 * @date       : 2014年9月17日 下午8:23:05
 */
public class TestSemaphore {

    public static void main(String[] args) {

        final Semaphore sa = new Semaphore(1);
        final Semaphore sb = new Semaphore(0);
        final Semaphore sc = new Semaphore(0);

        final Random random = new Random(System.currentTimeMillis());

        new Thread(new Runnable() {
            public void run() {
                try {
                    while(true){
                        Thread.sleep(random.nextInt(3000));
                        sa.acquire();
                        doing("A");
                        sb.release();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"线程a").start();

        new Thread(new Runnable() {
            public void run() {
                try {
                    while(true){
                        Thread.sleep(random.nextInt(3000));
                        sb.acquire();
                        doing("B");
                        sc.release();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"线程b").start();

        new Thread(new Runnable() {
            public void run() {
                try {
                    while(true){
                        Thread.sleep(random.nextInt(3000));
                        sc.acquire();
                        doing("C");
                        sa.release();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"线程c").start();

    }

    /**
     * @Description:打印出线程的名字
     * @param msg
     * @returType:void
     */
    public static void doing(String msg){
        System.out.println(Thread.currentThread().getName()+":"+msg);
    }

}
时间: 2024-11-10 00:12:32

采用java信号量(semaphore)让线程轮流打印的相关文章

Java n个线程轮流打印数字的问题

一. 实现两个线程.轮流打印出数字.例如以下: bThread --> 10 aThread --> 9 bThread --> 8 aThread --> 7 bThread --> 6 aThread --> 5 bThread --> 4 aThread --> 3 bThread --> 2 aThread --> 1 用java中的Lock类实现: package com.yjq.thread_demo; import java.uti

Java 信号量 Semaphore

public static void main(String[] args) { // 线程池 ExecutorService exec = Executors.newCachedThreadPool(); // 只能5个线程同时访问 final Semaphore semp = new Semaphore(5); // 模拟20个客户端访问 for (int index = 0; index < 20; index++) { final int NO = index; Runnable run

java 信号量Semaphore

在很多情况下,可能有多个线程需要访问数目很少的资源.假想在服务器上运行着若干个回答客户端请求的线程.这些线程需要连接到同一数据库,但任一时刻 只能获得一定数目的数据库连接.你要怎样才能够有效地将这些固定数目的数据库连接分配给大量的线程? 答:1.给方法加同步锁,保证同一时刻只能有一个人去调用此方法,其他所有线程排队等待,但是此种情况下即使你的数据库链接有10个,也始终只有一个处于使 用状态.这样将会大大的浪费系统资源,而且系统的运行效率非常的低下. 2.另外一种方法当然是使用信号量,通过信号量许

Java-两个线程轮流打印数字的问题

实现两个线程,轮流打印出数字,如下: bThread --> 10 aThread --> 9 bThread --> 8 aThread --> 7 bThread --> 6 aThread --> 5 bThread --> 4 aThread --> 3 bThread --> 2 aThread --> 1 用java中的Lock类实现: package com.yjq.thread_demo; import java.util.con

头条面试题之实现两个线程轮流打印字符串

在面试头条的时候,有一个很有意思的题目,利用两个线程交替打印一个字符串,这里主要就是对多线程中wait/notify的应用,特此记录. 对于wait()和notify()的理解,还是要从jdk官方文档中开始,在Object类方法中有: void notify() Wakes up a single thread that is waiting on this object’s monitor. 译:唤醒在此对象监视器上等待的单个线程 void notifyAll() Wakes up all t

Java并发:三个线程轮流打印十次abc

方法1:用synchronized.wait.notifyAll实现 public class Main { static boolean t1Running = true; static boolean t2Running = false; static boolean t3Running = false; public static void main(String[] args) throws InterruptedException { final Object lock = new O

Java信号量Semaphore

Semaphore Semaphore分为单值和多值两种,前者只能被一个线程获得,后者可以被若干个线程获得. Semaphore实现的功能就类似厕所有5个坑,假如有10个人要上厕所,那么同时只能有多少个人去上厕所呢?同时只能有5个人能够占用,当5个人中 的任何一个人让开后,其中等待的另外5个人中又有一个人可以占用了.另外等待的5个人中可以是随机获得优先机会,也可以是按照先来后到的顺序获得机会,这取决于构造Semaphore对象时传入的参数选项.单个信号量的Semaphore对象可以实现互斥锁的功

Java 信号量 Semaphore 介绍

 Semaphore当前在多线程环境下被扩放使用,操作系统的信号量是个很重要的概念,在进程控制方面都有应用.Java 并发库 的Semaphore 可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可.比如在Windows下可以设置共享文件的最大客户端访问个数. Semaphore实现的功能就类似厕所有5个坑,假如有10个人要上厕所,那么同时只能有多少个人去上厕所呢?同时只能有

了解信号量Semaphore和线程池的差异

信号量 其实本质上是锁,Lock是单锁,信号量是指定多把锁,也就是说通过信号量指定多个数线程可以访问相同资源,一般情况下读操作可以有多个,但写操作同时只有一个 信号量模块 semaphore # 使用起来和普通锁没 什么区别,但这个是比锁更加粗粒度锁,锁的是线程 # 在线程实例前加锁,把锁传递进线程,在线程结束时候释放锁 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 from threading import Thread