实现两个线程A,B,A打印5个奇数,B打印5个偶数,交替进行,如此循环50次
来源:互联网 发布:趣味性软件使用教程 编辑:程序博客网 时间:2024/05/01 13:09
1.要点:
(1). 在同一个类中实现打印奇数和打印偶数的方法,并且这两个方法都需要被synchronized修饰,因为wait() notify()只能在synchronized修饰的代码块中运行。(2). 在类中设置一个线程执行的标志oddOrder,这个标志用来说明线程执行的次数,如果oddOrder==true,说明轮到打印奇数的线程执行了,如果为false,说明轮到打印偶数的线程的执行了。
(3). 方法中一定是先调用notify(),然后再调用wait(),不然线程只执行一次(因为都进入wait状态,或标志oddOrder未修改成功)。
(4). 在主函数中用同一个对象实现打印奇数和偶数的功能,因为wait()只是释放本对象的对象锁。
package com.thread.test;public class ThreadTest {public static void main(String[] args) { final PrintNum pn = new PrintNum(); //使用同一个对象执行任务 new Thread(new Runnable() { //打印奇数线程 @Override public void run() { for(int i=0;i<10;i++){ //执行10次 pn.printOdd(); } System.out.println("first thread stop !"); } }).start(); new Thread(new Runnable(){ //打印偶数线程 @Override public void run() { for(int i=0;i<10;i++){ pn.printEven(); } System.out.println("second thread stop !"); } }).start(); }}class PrintNum{ private int cur = 1; private boolean printOddFlag = true; //打印odd的标志位 //打印5个奇数 public synchronized void printOdd(){ if(!printOddFlag){ try { //释放对象锁 //线程在获取对象锁后,主动释放对象锁,同时本线程休眠 this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } for(int i=cur;i<cur+10;i+=2){ System.out.print(i+" "); } System.out.println(); printOddFlag = false; //对象锁的唤醒操作 //唤醒其他所有进程(其实只有一个),线程执行到此不是立即释放对象锁,而是要退出synchronized代码块后,当前线程才会释放对象锁 this.notify(); } //打印5个偶数 public synchronized void printEven() { if(printOddFlag){ try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } for(int i=cur+1;i<cur+1+10;i+=2){ System.out.print(i+" "); } System.out.println(); cur += 10; printOddFlag = true; this.notify(); }}
0 0
- 实现两个线程A,B,A打印5个奇数,B打印5个偶数,交替进行,如此循环50次
- 3个线程,分别打印A,B,C,循环打印ABC十次
- 两个线程A和B, A打印1, 3, ..., 99, B打印2, 4, ..., 100, 要求A和B严格交替打印(Java实现)
- 多线程交替打印A,B
- JAVA A B C 循环打印10次实现
- 建立三个线程,A线程打印10次A,B线程打印10次B,C线程打印10次C,要求线程同时运行,交替打印10次ABC。
- 建立三个线程,A线程打印10次A,B线程打印10次B,C线程打印10次C,要求线程同时运行,交替打印10次ABC
- 建立三个线程,A线程打印10次A,B线程打印10次B,C线程打印10次C,要求线程同时运行,交替打印10次ABC。
- 建立三个线程,A线程打印10次A,B线程打印10次B,C线程打印10次C,要求线程同时运行,交替打印10次ABC。
- 多线程技术: 两个线程交替打印奇数和偶数
- 三个线程交替打印A、B、C的问题
- Java多线程--三个线程分别打印a,b,c.请用多线程实现循环打印15次abc
- java 三个线程分别打印A B C 50次
- 转:java实现三个线程A B C,A线程打印A之后才能B线程打印B,然后接着C线程执行打印C,继而循环下去
- java实现三个线程A B C,A线程打印A之后才能B线程打印B,然后接着C线程执行打印C,继而循环下去
- 转:java实现三个线程A B C,A线程打印A之后才能B线程打印B,然后接着C线程执行打印C,继而循环下去
- 有三个线程A、B、C(线程名称或id),循环打印10次ABCABB
- 有三个线程A,B,C 循环10次打印出三个线程的名字ABCABCABCABCABCABCABCABCABCABC
- 用Java实现给图片添加文字水印
- 各种排序算法的JAVA实现
- 2
- 深入浅出DNS系列(五)-查询过程详解
- 基于Vue2的移动端开发环境搭建详解
- 实现两个线程A,B,A打印5个奇数,B打印5个偶数,交替进行,如此循环50次
- 用Struts2写了一个小Demo,含简单的CRUB功能
- POI生成excel数据量大时内存溢出解决
- 4650: [Noi2016]优秀的拆分
- h5 canvas 绘制的写轮眼特效
- 安卓学习 权限Permission
- 深度学习方法(十一):卷积神经网络结构变化——Google Inception V1-V4,Xception(depthwise convolution)
- 经典算法汇总-第一章
- Leetcode练习 412. Fizz Buzz