Java两个线程交替打印字母A-Z_Ry乐的博客-程序员秘密

技术标签: java  

方法一:

private static Object obj = new Object();
private static int s = 65;

public static void main(String[] args) throws Exception {

    new Thread(new Runnable() {
        @Override
        public void run() {
            synchronized (obj){
                while(s <= 90){
                    if(s % 2 != 0){
                        System.out.println(Thread.currentThread().getName() + ":" + (char)s++);
                        obj.notifyAll();
                    }else{
                        try {
                            obj.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }

        }
    },"thread-1").start();

    new Thread(new Runnable() {
        @Override
        public void run() {
            synchronized (obj){
                while(s <= 90){
                    if(s % 2 == 0){
                        System.out.println(Thread.currentThread().getName() + ":" + (char)s++);
                        obj.notifyAll();
                    }else{
                        try {
                            obj.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }).start();

}

方法二:

private Lock lock = new ReentrantLock();
private Condition aCondition = lock.newCondition();
private Condition bCondition = lock.newCondition();

private static int i = 65;

private void print1() {
    lock.lock();
    try {
        while (i <= 90) {
            if (i % 2 != 0) {
                System.out.println(Thread.currentThread().getName() + "_" + (char) i++);
                bCondition.signal();
            } else {
                aCondition.await();
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        lock.unlock();
    }

}

private void print2() {
    lock.lock();
    try {
        while (i <= 90) {
            if (i % 2 == 0) {
                System.out.println(Thread.currentThread().getName() + "_" + (char) i++);
                aCondition.signal();
            } else {
                bCondition.await();
            }
        }

    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        lock.unlock();
    }

}

public static void main(String[] args) {
    final ConditionTest test = new ConditionTest();

    new Thread(new Runnable() {
        @Override
        public void run() {
            test.print2();
        }
    }, "线程2").start();

    new Thread(new Runnable() {
        @Override
        public void run() {
            test.print1();
        }
    }, "线程1").start();


}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/woailele123456/article/details/105820625

智能推荐

知识图谱概要_weixin_34293246的博客-程序员秘密

2019独角兽企业重金招聘Python工程师标准&gt;&gt;&gt; ...

vue填坑系列之在main.js中引入相应的js插件不生效_vue脚手架在main.js中导入全局样式不生效_xuxinwen32的博客-程序员秘密

需求:在main.js中引入相应的js插件不生效;原因:相应的插件没有将模块export default;解决方案:所以比较好的办法是在index.html渲染静态页面的时候直接用script标签的形式引入;...

Vue3.2中的setup语法糖_油墨香^_^的博客-程序员秘密

子组件怎么向父组件抛出事件?defineEmits的到来!style v-bind 该同学已经从实验室毕业了。style v-bind将span变成红色。变量、方法不需要 return 出来。分析引入 setup 后组件的变化。vue3.2 到底更新了什么?defineProps 的使用。新增 defineProps。如何获取子组件中的属性值。setup 的简单介绍。新增指令 v-memo。

linux中访问文件失败 被拒绝 Permission denied_linux系统运行文件拒绝访问_叫小哥的博客-程序员秘密

原因是没有授权 那么授权命令为 chmod 755 -R filename 再次重新访问 如果仍然无法访问 那么给此文件的父文件夹授权   访问的权限 chmod 755 -R dirname

java中集合的取值、遍历及session简单用法_java 遍历session_bo_301的博客-程序员秘密

创建Map集合并获取session值:Map&lt;Integer, Integer&gt; shopCar = (Map&lt;Integer, Integer&gt;) request.getSession().getAttribute(“shopCar”);// get到shopCar这个map中的所有keySet ids = shopCar.keySet();//遍历set中每个key中的值for (Integer id : ids) {}//通过每个key(即id),获取该id的每条记

【知识图谱导论-浙大】第一章:知识图谱概论_科皮子菊的博客-程序员秘密

话说回来,什么是知识呢(what is knowledge)?针对这个哲学问题,柏拉图说:Knowledge is justified true belief。其实仔细一想,人类的自然语言、创作的绘画与音乐、数学语言、物理模型、化学公式等都是人类知识的表示形式和传承方式。具有获取、表示和处理知识的能力是人类心智区别于其它物种心智的最本质特征,也是人脑智能的最本质特征。

随便推点

费马小定理和欧拉定理及其证明_门豪杰的博客-程序员秘密

费马小定理: 若p是素数, a是正整数且不能被p整除, 则 ap−1=1(modp)ap−1=1(modp){ a }^{ p-1 }\quad =\quad 1(mod\quad p) 费马小定理的扩展: ap=a(modp)ap=a(modp){ a }^{ p }\quad =\quad a(mod\quad p)证明:首先, 给定一个小于p的正整数的集合x{1,....

easyui中 form combobox datagrid 等有回显功能的对象方法 onBeforeLoad 获取当前对象_easyui onbeforeload_Mr_fly520的博客-程序员秘密

&amp;lt;!DOCTYPE html&amp;gt;&amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt; &amp;lt;title&amp;gt;Validate Form on Submit - jQuery EasyUI Demo&amp;lt;/title&amp;gt; &amp;lt;link rel=&qu

vmware12虚拟机 以及苹果系统、乌班图和红帽 百度网盘下载连接_vmware12下载 百度网盘_舒默哦.的博客-程序员秘密

最近vmwaer官网下载虚拟机太慢了,才100kb左右,我不知道你们有没有遇到这种情况。我网盘里是存了vmware12这个版本,现在最新的是vmware15,那么可以更新到vmware15,注册码就不用说了吧,网上有一搜,就能搜出一大堆免费注册码,我分享里还提供了带苹果系统、乌班图和红帽这几个系统,想要windows系统的,直接搜msdn,里面就有,好了,废话这么多,下面是百度盘连接,失效了可以联...

InputStream——输入流读取数据缺失或多余现象_inputstream数据丢失_David-Kuper的博客-程序员秘密

写Java、android的程序员应该对InputStream再熟悉不过了。不管是文件操作还是网络传输,只要牵扯到传输数据的时候都难免会用到它。输入流能够快速的读取我们文件或者网络的数据,但有时候也会碰到问题——数据缺失或多余。这里面其实不是输入流本身的问题,字节是完完全全读取到了,是在将编码转换成字符的时候出现了问题。是字节数组多余空间上的默认值(0)参与了转换导致混乱而产生的。

广度优先遍历(无向图 C语言 邻接矩阵实现)_YKK1879的博客-程序员秘密

#include&lt;stdio.h&gt;//数组表示法(领接矩阵实现)#define MAXN 20typedef struct{ char vertec[MAXN]; char arcs[MAXN][MAXN];}ArrayGraph;typedef struct node{ int vertec; struct node *next;}*NODE;type...