java n 个线程顺序打印 n 个字符的通用解决方案

本贴最后更新于 2762 天前,其中的信息可能已经东海扬尘

闲来无事,练习一下,主要用重入锁的 condition 解决了 notify 的效率问题

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public class Main {

public static ReentrantLock reentrantLock =new ReentrantLock();

//从某个字符开始
 public static Character next = 'A';

public static void main(String[] args) {

    // input
 Character[] characters = {'A', 'B', 'C', 'D'};

    Integer length = characters.length;

    Condition[] conditions = new Condition[length];
    for (int j = 0; j < length; j++) {
        conditions[j] = reentrantLock.newCondition();
    }

    for (int j = 0; j < length; j++) {
        new Thread(new Irunable(conditions[j], characters[j], characters[j + 1 >= length ? 0 : j + 1], conditions[j + 1 >= length ? 0 : j + 1])).start();
    }

}

}

class Irunable implements Runnable {

public Condition currentCondition;

public Character c;

public Character nextC;

public Condition afterCondition;

public Irunable(Condition currentCondition, Character c, Character nextC, Condition afterCondition) {
    this.currentCondition = currentCondition;
    this.c = c;
    this.nextC = nextC;
    this.afterCondition = afterCondition;
}

@Override
 public void run() {

    while (true) {

        try {

            Main.reentrantLock.lock();

            if (c != Main.next) {
                currentCondition.await();
            }

            Thread.sleep(1000);
            System.out.println(c);
            Main.next = nextC;
            afterCondition.signal();

        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            Main.reentrantLock.unlock();
        }
    }

}
}
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3168 引用 • 8207 回帖
  • condition
    2 引用 • 10 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • Eddie

    消灭零回复

  • cloudlang

    以前从来没研究个这个,有意思

  • yangyujiao

    y 什么时候这么好学了·

  • wizardforcel 1

    我也随手写了一个。。

    from threading import Lock, Thread
    import sys
    
    c = 'A'
    l = Lock()
    
    def thread_work():
        global c, l
        
        with l:
            print c
            c = chr(ord(c) + 1)
            
    
    def main():
        num = 5
        
        for i in xrange(num):
            Thread(target=thread_work).start()
    
    
    main()
    
    1 回复
  • mainlove
    作者

    我是每个线程只能打印一个

    你这种。。。。。。。 几乎就是串行了。。。。。。。。。是不。。。。

    1 回复
  • wizardforcel

    你的 Condition 也是串行。

    不串行只有一个办法,使用 Java 里自带的 AtomicInteger。

    1 回复
  • wizardforcel

    总算明白了,你想让每个线程按照创建顺序打印字符。。

    我拿 python 写了一遍,然后执行就卡住了。。

    from threading import Lock, Thread, Condition
    import sys
    
    cur = 'A'
    l = Lock()
    conds = []
    
    def thread_work(i, c):
        global cur, l, conds
        
        with l:
            if cur != c:
                conds[i].wait()
            print cur
            cur = chr(ord(cur) + 1)
            if i + 1 != len(conds):
                conds[i + 1].notify()
            
    
    def main():
        global cur, l, conds
        
        num = 5
        for i in xrange(num):
            conds.append(Condition(l))
        
        for i in xrange(num):
            c = chr(ord(cur) + i)
            Thread(target=thread_work, args=(i, c)).start()
    
    
    main()
    
    1 回复
  • wizardforcel

    好了解决了,倒数第三句改成 c = chr(ord('A') + i),线程启动后 cur 会变。。

  • mainlove
    作者

    不是。。。。。那个 jdk 的 lock

  • mainlove
    作者

    你这样写 不就是把我写的翻译成另外的语言了。。。。。。。。。。。。

请输入回帖内容 ...

推荐标签 标签

  • 博客

    记录并分享人生的经历。

    270 引用 • 2386 回帖
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 511 关注
  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    5 引用 • 13 回帖
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 441 关注
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    169 引用 • 799 回帖 • 1 关注
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    103 引用 • 126 回帖 • 447 关注
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 107 关注
  • 996
    13 引用 • 200 回帖 • 1 关注
  • GitBook

    GitBook 使您的团队可以轻松编写和维护高质量的文档。 分享知识,提高团队的工作效率,让用户满意。

    3 引用 • 8 回帖 • 1 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖 • 1 关注
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 619 关注
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 588 关注
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖 • 2 关注
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 152 关注
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 53 关注
  • 自由行
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 290 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3168 引用 • 8207 回帖
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    311 引用 • 546 回帖 • 34 关注
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    228 引用 • 1450 回帖
  • HTML

    HTML5 是 HTML 下一个的主要修订版本,现在仍处于发展阶段。广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。

    103 引用 • 294 回帖
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 39 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    10 引用 • 85 回帖
  • 安全

    安全永远都不是一个小问题。

    189 引用 • 813 回帖
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 741 关注