`

使用Semaphore优雅解决打印ABC, ABCD 的问题

    博客分类:
  • JAVA
阅读更多
public class ABCPrint {
  public static void main(String[] args){
    Semaphore sa = new Semaphore(1);
    Semaphore sb = new Semaphore(0);
    Semaphore sc = new Semaphore(0);
    int count = 10;

    ExecutorService service = Executors.newFixedThreadPool(3);
    service.execute(new PrintTask("A", sa, sb, count));
    service.execute(new PrintTask("B", sb, sc, count));
    service.execute(new PrintTask("C\n", sc, sa, count));
    service.shutdown();
  }

  static class PrintTask implements Runnable{
    private String str;

    private Semaphore curr;

    private Semaphore next;

    private int count;

    public PrintTask(String str, Semaphore curr, Semaphore next, int count){
      this.str = str;
      this.curr = curr;
      this.next = next;
      this.count = count;
    }

    @Override
    public void run() {
      while(true){
        if(count > 0){
          try {
            curr.acquire();
            System.out.print(str);
            next.release();
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
          count --;
        }else{
          break;
        }
      }
    }
  }
}
分享到:
评论

相关推荐

    java多线程每个线程挨着打印ABC的4种实现方式

    java多线程每个线程挨着打印ABC的4种实现方式,有4个线程t1、t2、t3、t4,t1打印A后t2打印A再t3打印A再t4打印A,然后从新回到t1打印B再t2打印B...t4打印B... 4个线程轮流打印abc... 一个线程可以理解为一个人,打印...

    semaphore完整搭建ansible部署方案

    Semaphore 是一个强大的自动化部署工具,它使用 Ansible 来实现对多主机的配置管理。Ansible 是一个流行的 IT 自动化框架,它允许管理员通过编写 YAML 格式的 Playbook 来执行任务,如软件部署、配置管理和应用生命...

    Semaphore的使用及其方法的使用

    Semaphore的使用及其方法的使用。

    semaphore控制多线程循序执行

    例如,如果我们要实现一个打印队列,让多个线程按顺序打印任务,Semaphore就可以用来保证打印任务的顺序执行,防止多个线程同时打印。 以下是如何使用Semaphore的基本步骤: 1. 初始化Semaphore:创建一个...

    使用信号量(Semaphore)实现线程的同步

    信号量(Semaphore)是...信号量是解决线程同步问题的一种高效工具,通过合理的信号量控制,可以有效地避免死锁、饥饿等问题,提高系统资源的利用率。理解并正确使用信号量,对于编写高效、稳定的多线程程序至关重要。

    Swift-dispatch-semaphore

    在iOS开发中,理解并熟练使用`DispatchSemaphore`对于优化代码性能和处理同步问题至关重要。本文将深入探讨`DispatchSemaphore`的原理、用法以及在实际开发中的应用场景。 `DispatchSemaphore`是一种信号量机制,它...

    java.Semaphore(解决方案).md

    java.Semaphore(解决方案).md

    Linux下多线程编程-Pthread与Semaphore的使用.doc

    Semaphore 可以用来解决多线程编程中的典型问题,如生产者-消费者问题。Semaphore 的使用可以分为两步:首先,创建一个 Semaphore 对象,然后使用 Semaphore 对象来控制线程的访问顺序。 在 Linux 下,我们可以使用...

    semaphore-develop.zip

    2. **数据库交互**:Semaphore需要与数据库进行交互以存储项目配置、构建历史等数据,可能使用的是常见的关系型数据库如MySQL或非关系型数据库如MongoDB。 3. **API接口**:为了支持与其他工具的集成,Semaphore可能...

    Ansible-semaphore.zip

    对于那些想要尝试 Ansible 自动化但又不希望投入大量资源在 Tower 上的组织来说,Semaphore 是一个理想的解决方案。 在部署和使用 Semaphore 之前,你需要确保满足以下先决条件: - 安装 Ansible:Semaphore 基于 ...

    Java多线程连续打印abc实现方法详解

    Java多线程连续打印abc实现方法详解 Java多线程连续打印abc实现方法详解是 Java 编程...解决 Java 多线程连续打印abc问题需要使用同步机制来确保三个线程的顺序执行。可以使用两个锁或信号量来实现该问题的解决方案。

    C#语言Semaphore类用法实例(多线程多端口使用端口控制)

    总的来说,Semaphore类在C#中的应用可以帮助开发者有效地管理资源,避免因过度并发导致的冲突和数据不一致性问题。通过理解Semaphore的工作原理和正确使用方式,我们可以编写出更健壮、高效的多线程程序。在这个实例...

    pc_semaphore.zip_pc_semaphore

    "pc_semaphore.zip_pc_semaphore"这个压缩包文件,显然与线程同步机制有关,特别是使用信号量(Semaphore)解决读者-写者问题。信号量是一种在多线程环境中用于控制对共享资源访问的机制,可以防止多个线程同时访问...

    Semaphore进程间通讯测试源码

    开发者可能会看到如何在多线程或跨进程的环境下,通过Semaphore控制资源的并发访问,防止数据竞争和死锁等问题。通过学习这个源码,可以深入理解Semaphore的工作原理以及在实际应用中的使用方法,这对于开发需要进程...

    Semaphore 源码解析

    在构造Semaphore时,可以通过传入布尔值决定使用哪种类型的锁。 在Semaphore中,`acquire()`方法用于获取一个许可,如果当前许可数足够,线程将获得同步状态并减少许可数,否则线程将被放入同步队列等待。`release...

    OC-dispatch-semaphore

    `dispatch_semaphore` 是GCD中的一个关键工具,用于控制对共享资源的访问,防止数据竞争和死锁等问题。 一、什么是Dispatch Semaphore? Dispatch semaphore是一种信号量机制,源自传统的操作系统概念。在GCD中,...

    利用semaphore实现shm进程通信

    为了解决访问冲突和同步问题,引入了三个信号量:`SEM_MUTEX`用于互斥访问,`SEM_BLOCKING`用于阻塞通知,`SEM_INIT`则用于初始化标志。 #### PV操作详解:实现互斥与同步 PV操作是信号量的核心,用于实现对资源的...

Global site tag (gtag.js) - Google Analytics