专栏首页麒思妙想如何让两个线程“系鞋带"

如何让两个线程“系鞋带"

前两天转了马士兵老师的《没错,我就是厕所所长!》,正好有朋友和我讨论一个线程打印的问题,于是今天就趁着周末们睡觉,写了个简单的实现。

题干,是这样的,通过2个线程,交替输出 A1B2C3....Z26

先贴出我的实现,欢迎大家和我讨论

public class TwoThread2 {
    public static class Printer{
        public synchronized void print(String i) {
            try {
                this.notify();
                System.out.println(Thread.currentThread().getName() + " " + i);
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    //两个线程交替输出, A1B2C3.....Z26
    public static final int SETPS = 26;
    public static class ThreadNum extends Thread {
        private int startCharCount = 1;
        private Printer p = new Printer();
        public Printer getP() {
            return p;
        }
        public void setP(Printer p) {
            this.p = p;
        }
        @Override
        public void run() {
            for (int i = 0; i < SETPS; i++) {
                p.print(startCharCount+++"");
            }
        }
    }
    public static class ThreadStr extends Thread {
        private int startCharCount = 65;
        private Printer p = new Printer();
        public Printer getP() {
            return p;
        }
        public void setP(Printer p) {
            this.p = p;
        }
        @Override
        public void run() {
            for (int i = 0; i < SETPS; i++) {
                p.print( (char) startCharCount+++"");
            }
        }
    }
    public static void main(String[] args) {
        Printer p = new Printer();
        ThreadNum tn = new ThreadNum();
        tn.setName("Thread num :");
        tn.setP(p);
        ThreadStr ts = new ThreadStr();
        ts.setName("Thread str :");
        ts.setP(p);
        ts.start();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        tn.start();
    }
}

大概实现就是这样的,这个流程有点想系鞋带,用一个线程专门打印字符串,一个线程打印数字,然后线程交替加锁,释放,流程大概如下所示。

如果文章对您有那么一点点帮助,我将倍感荣幸,

本文分享自微信公众号 - 麒思妙想(qicai1612),作者:dafei1288

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-08-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 傻白甜,约不约?

    首先来介绍下,今天的主角“傻白甜”(SBT:Simple Build Tools), 其功能与 Maven 和 Gradle 类似。其是由 Scala 编写,对...

    麒思妙想
  • JimSQL

    翻出来10年前自己写的一个玩具文本数据库,这个项目期初来自ACM月赛的一道题,然后被扩充成了这个样子。当时给取名JimSQL,寓意Jim Isn't MySQL...

    麒思妙想
  • 分布式系统课程笔记——2.RPC和线程

    麒思妙想
  • Java线程的基本使用

    在Java中使用多线程,本质上还是对Thread对象的操作。线程池只是为了方便对线程的管理,避免频繁的创建和销毁线程带来不必要的系统开销,内部通过指定的线程数和...

    spilledyear
  • 多态、多态的好处(扩展性)

    1、多态:同一个对象,在不同时刻体现出来的不同状态。 2、多态的前提:   1)要有继承关系或实现关系(接口);   2)要有方法重写;   3)要有父...

    良月柒
  • 常用设计模式——状态模式

    用户5325874
  • 2.下拉刷新、二维码

    六月的雨
  • 恕我直言你可能真的不会java第6篇:Stream性能差?不要人云亦云

    问:stream比for循环慢5倍,用这个是为了啥? 答:互联网是一个新闻泛滥的时代,三人成虎,以假乱真的事情时候发生。作为一个技术开发者,要自己去动手去做,...

    字母哥博客
  • 外观模式的介绍以及与适配器模式和装饰者模式的区别

    举例:我需要打开微信发送给某个好友某些内容,其中的过程包括了,下载微信,输入账号密码,点击登陆,找到好友,发送消息。这些整体封装成了一个对外的方法,当我调用需要...

    乱敲代码
  • 外观模式的介绍以及与适配器模式和装饰者模式的区别

    举例:我需要打开微信发送给某个好友某些内容,其中的过程包括了,下载微信,输入账号密码,点击登陆,找到好友,发送消息。这些整体封装成了一个对外的方法,当我调用需要...

    杨小杰

扫码关注云+社区

领取腾讯云代金券