对于交替打印的线程问题:

方法1:非标志方法

package com.exam_1;
/*
定义一个线程A,输出1 ~ 10之间的整数,定义一个线程B,逆序输出1 ~ 10之间的整数(10)要求线程A和线程B交替输出*/
/*
非标志位方法*/
public class Demo04_pp {public static void main(String[] args){Object obj=new Object();//定义一个对象obj//将此对象分别传给A,B,也就是说ab共用一个对象A2 a=new A2(obj);B2 b=new B2(obj);//启动线程a.start();b.start();}
}class A2 extends Thread{Object obj;public A2() {super();}//定义obj的构造方法public A2(Object obj) {super();this.obj = obj;}//正序打印@Overridepublic void run() {//此时obj就是主函数中定义的objsynchronized (obj) {for(int i=1;i<11;i++){System.out.print(i+",");obj.notify();//第一次程序走到这里时,这个并没有什么用。try {//obj  -  B等待obj.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}
}
class B2 extends Thread{Object obj;public B2() {super();}public B2(Object obj) {super();this.obj = obj;}//逆序打印@Overridepublic void run() {try {//先让B的run方法sleep,这样最先调用的就是A的run方法Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}//B中的obj也是主函数中定义的objsynchronized (obj) {for(int i=10;i>0;i--){System.out.print(i+",");obj.notify();//唤醒在此对象监视器上等待的单个线程。此时在这个对象监视器上等待的线程即为Aif (i > 1) {try {obj.wait();//当输出一个数是将此线程进入wait状态,这是A线程再进来} catch (InterruptedException e) {e.printStackTrace();}}}}}
}
package com.henu;import java.awt.font.NumericShaper;/*
1. 创建两个线程,其中一个输出1-52,另外一个输出A-Z。输出格式要求:12A 34B 56C 78D*/
public class Test01 {public static void main(String[] args) {Object obj = new Object();Number n = new Number(obj);Letter l = new Letter(obj);n.start();l.start();}
}class Number extends Thread{Object obj;public Number() {}public Number(Object obj) {this.obj = obj;}@Overridepublic void run() {synchronized (obj){int i = 1;while(i <= 52){System.out.print(i);System.out.print(i+1);i += 2;obj.notify();try {obj.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}
}class Letter extends Thread{Object obj;public Letter() {}public Letter(Object obj) {this.obj = obj;}@Overridepublic void run() {try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}synchronized(obj){for (int i = 65; i <= 90; i++) {System.out.print((char) i+",");obj.notify();if (i < 90) {try {obj.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}}
}

2.采用标志方法

package com.henu;
/*
编写程序实现,子线程循环3次,接着主线程循环5次,接着再子线程循环3次,主线程循环5次,如此反复,循环3次.*/
public class Test03 {public static void main(String[] args) {final ThreadFunction2 f2 = new ThreadFunction2();// 子线程循环3次new Thread(new Runnable(){public void run(){for(int i=0;i<3;i++){f2.subFunction();}}}).start();// 主线程循环3次for(int i=0;i<3;i++){f2.mainFunction();}}}// 编写功能类,实现子线程和主线程的功能
class ThreadFunction2 {private boolean flag = false;// 主线程要实现的功能public synchronized void mainFunction(){while(!flag){try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}for(int i=0;i<5;i++){System.out.println("mainFunction"+i);}this.notify();flag = false;}// 子线程要实现的功能public synchronized void subFunction(){while(flag){try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}for(int i=0;i<3;i++){System.out.println("subFunction"+i);}this.notify();flag = true;}}

java基础---多线程之交替打印,等待唤醒机制相关推荐

  1. Java——线程锁,死锁,等待唤醒机制

    一.线程锁 线程安全问题 其实,线程安全问题都是由全局变量及静态变量引起的.若每个线程中对全局变量.静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的:若有多个线程同时执行写操作,一般 ...

  2. Java线程等待唤醒机制(加深理解)

    今天看源码的时候遇到这样一个场景,某线程里面的逻辑需要等待异步处理结果返回后才能继续执行.或者说想要把一个异步的操作封装成一个同步的过程.这里就用到了线程等待唤醒机制,下面具体看一下. 等待唤醒机制示 ...

  3. 27_多线程_第27天(线程安全、线程同步、等待唤醒机制、单例设计模式)_讲义...

    今日内容介绍 1.多线程安全问题 2.等待唤醒机制 01线程操作共享数据的安全问题 *A:线程操作共享数据的安全问题如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程 ...

  4. 27_多线程_第27天(线程安全、线程同步、等待唤醒机制、单例设计模式)

    今日内容介绍 1.多线程安全问题 2.等待唤醒机制 01线程操作共享数据的安全问题 *A:线程操作共享数据的安全问题如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程 ...

  5. java基础提升(二):多线程、线程安全、线程状态、等待唤醒机制、线程池

    目录 一. 多线程 1.1并发与并行 1.2 线程与进程 1.3 创建线程类 1.3.1 方式一:继承Thread类 1.3.2 方式二:实现Runnable接口 1.3.3 Thread和Runna ...

  6. Java多线程02(线程安全、线程同步、等待唤醒机制)

    Java多线程2(线程安全.线程同步.等待唤醒机制.单例设计模式) 1.线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量 ...

  7. 进阶12 多线程、等待唤醒机制、线程池

    多线程 我们在之前,学习的程序在没有跳转语句的前提下,都是由上至下依次执行,那现在想要设计一个程序,边打游戏边听歌,怎么设计? 要解决上述问题,咱们得使用多进程或者多线程来解决. 并发与并行 并发:指 ...

  8. Java两个线程交替打印奇偶数(两种方法对比)

    简介 本文将承接文章<Java多线程wait()和notify()系列方法使用教程>,我们将通过"两个线程交替打印100内的奇偶数",来展示下wait()方法和noti ...

  9. 多线程之间的通信(等待唤醒机制、Lock 及其它线程的方法)

    一.多线程之间的通信. 就是多个线程在操作同一份数据, 但是操作的方法不同. 如: 对于同一个存储块,其中有两个存储位:name   sex, 现有两个线程,一个向其中存放数据,一个打印其中的数据. ...

最新文章

  1. 《Adobe AIR权威指南》——《Flex 3权威指南》作者新作
  2. 每天一个linux命令(18):locate 命令
  3. 检查多边形是否包含了某点(经纬度)
  4. mysql不能删除外键吗,MySQL不能删除外键约束所需的索引
  5. linux睿频是自动的吗,Linux限制cpu睿频限制频率
  6. 苹果宣布取消AirPower 因技术难题无法攻克
  7. Linux切换slave,热备服务器中,切换master中切换SQL
  8. 如何用编程得出泰坦尼克号生还者的年龄段?
  9. leetcode题解—1021、删除最外层的括号
  10. EMVI5.3 将数据信息改为投影坐标系
  11. 信息安全与管理的分析理解
  12. 奥城大学计算机专业,研究生美国留学双录取院校汇总
  13. 从码农到工程师:只要做到这6点
  14. 易语言服务器取cookie,易语言取设COOKIES的代码
  15. 痛与快乐有一个代码是什么_痛苦与快乐
  16. 【编程题】【Scratch三级】2021.03 接苹果
  17. 功能测试---正交实验法
  18. 0 Java语言简介
  19. 【flask】蓝图(Blueprint)
  20. python爬虫爬取小说网站并转换为语音文件

热门文章

  1. CodeForces - 1076D Edge Deletion(最短路+贪心/最短路树+bfs)
  2. HDU - 5592 ZYBs Premutation(线段树,逆序对)
  3. python左移位运算_python 移位运算符只能用于整型吗
  4. EOJ_1020_铁路调度
  5. c语言程序设计科学出版色,C语言程序设计9787030330123张淑华科学出版社
  6. 抚摸那条船——彭晓东
  7. 逆向工程核心原理读书笔记-API钩取之记事本小写转大写
  8. 【Boost】boost库asio详解1——io_service::run函数无任务时退出的问题
  9. Nginx 反向代理、动静分离、负载均衡及配置实例
  10. 经典永驻,重温设计模式 |硬核!