定义一个线程A,输出1 ~ 10之间的整数,定义一个线程B,逆序输出1 ~ 10之间的整数,要求线程A和线程B交替输出

方法一:非标志位方法

package Homework;
//1  定义一个线程A,输出1 ~ 10之间的整数,定义一个线程B,逆序输出1 ~ 10之间的整数,要求线程A和线程B交替输出
public class Test1 {public static void main(String[] args){Object obj=new Object();A a=new A(obj);B b=new B(obj);a.start();b.start();}}class A extends Thread{Object obj;public A() {super();}public A(Object obj) {super();this.obj = obj;}//正序打印@Overridepublic void run() {synchronized (obj) {for(int i=1;i<11;i++){System.out.print(i+",");obj.notify();try {obj.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}
}
class B extends Thread{Object obj;public B() {super();}public B(Object obj) {super();this.obj = obj;}//逆序打印@Overridepublic void run() {try {Thread.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}synchronized (obj) {for(int i=10;i>0;i--){System.out.print(i+",");obj.notify();if(i>1){try {obj.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}}
}

运行结果:

方法二:采用标志位

package Homework;
//1  定义一个线程A,输出1 ~ 10之间的整数,定义一个线程B,逆序输出1 ~ 10之间的整数,要求线程A和线程B交替输出
public class Test2 {public static void main(String[] args){C c=new C();A1 a1=new A1(c);B1 b1=new B1(c);a1.start();b1.start();}
}
class A1 extends Thread{C c;public A1(C c) {super();this.c = c;}public A1() {super();}@Overridepublic void run() {synchronized (c) {for(int i=1;i<11;i++){if(c.flag==true){try {c.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}c.print(i);c.flag=true;c.notify();}}}}
class B1 extends Thread{C c;public B1(C c) {super();this.c = c;}public B1() {super();}@Overridepublic void run() {synchronized (c) {for(int i=10;i>0;i--){if(c.flag==false){try {c.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}c.print(i);c.flag=false;c.notify();}}}
}
class C {boolean flag=false;//true A已经打印,B为打印 A等待public void print(int i){System.out.print(i+",");}
}

运行结果

Java之【线程通信】--标志位练习2相关推荐

  1. 线程中断标志位 interrupt()、interrupted()、isInterrupted() 的认识

    常见问题 首先你是怎么去关闭一个开启的线程.调用中断方法之后,线程就立即停止运行吗? 带着这两个问题探讨一下,主要围绕着这三个方法讲述: interrupt().interrupted().isInt ...

  2. java线程锁标记_java 线程 中断标志位

    课程素材来自 http://enjoy.ke.qq.com/    版权所有 java线程中,线程中断方法详解: 线程自然终止:自然执行完或抛出未处理异常 stop(),resume(),suspen ...

  3. java 线程 中断标志位

    课程素材来自 http://enjoy.ke.qq.com/    版权所有 java线程中,线程中断方法详解: 线程自然终止:自然执行完或抛出未处理异常 stop(),resume(),suspen ...

  4. 【Java】线程通信的例子:用两个线程打印 1-100;生产者消费者问题

    wait()和sleep()的区别 面试题:sleep() 和 wait()的异同? 相同点:一旦执行方法,都可以使得当前的线程进入阻塞状态. 不同点: 1)两个方法声明的位置不同:Thread类中声 ...

  5. java多线程 - 线程通信

    当线程在系统内运行时,程序通常无法准确控制线程的轮换执行,但是可以通过一些机制来保证线程协调运行. 由同步监视器对象协调线程 实现这种功能可以借助于Object类提供的wait().notify(). ...

  6. java中什么是标志位_Java学习笔记14---使用标志位控制循环

    使用标志位控制循环 前面提到了控制循环的常用技术:计数器控制的循环.另一种控制循环的常用技术是在读取和处理一个集合的值时指派一个特殊值.这个特殊的输入值也成为标志值(sentinel value),用 ...

  7. java实现线程通信的几种方式

    前言 在多线程的世界里,线程与线程之间的交互无处不在,只不过在平时的开发过程中,大多数情况下,我们都在单线程的模式下进行编码,即使有,也直接借助框架自身的机制实现了,其实线程之间的通信在JDK中是一个 ...

  8. Java多线程---线程通信(wait,notifyAll,生产者消费者经典范式,owner wait set,自定义显式锁BooleanLock)

    转自:https://blog.csdn.net/qq_35995514/article/details/91128585 1 学习内容 notifyAll 生产者.消费者经典范式 线程休息室 wai ...

  9. Java多线程-线程通信

    通信的方式 要想实现多个线程之间的协同,如:线程执行先后顺序.获取某个线程执行的结果等等.涉及到线程之间的相互通信,分为下面四类: 文件共享 网络共享 共享变量 JDK提供的线程协调API suspe ...

  10. 正确的线程中止-标志位

    在上方代码逻辑中,增加一个判断,用来控制线程执行的中止. public class Thread07 extends Thread { private volatile boolean isFlag ...

最新文章

  1. linux 当前活动用户,如何在Linux上自动记录所有用户的终端会话活动
  2. ISA防火墙之利用WINS服务器实现WPAD
  3. Oracle表字段的增删改和重命名
  4. 『中级篇』Docker Cloud自动构建 Docker image(55)
  5. CDN - 域名解析错误排查
  6. sphinx 项目根目录_如何使用Sphinx工具记录Django项目
  7. 苹果前CEO斯卡利变身创业导师:欲寻下个乔布斯
  8. IOC操作Bean管理XML方式(注入空值和特殊符号)
  9. Elasticsearch7.15.2 安装、部署(linux环境)
  10. 原生js获取document_原生JS常用API整理
  11. 今晚鼓捣的audio.js一些小经验
  12. 下岗工人到达退休年龄,养老保险未缴纳满15年,补缴合适吗?
  13. glDeleteTextures函数对内存的优化
  14. 北理在线作业答案c语言,北理乐学C语言答案,最新.doc
  15. 基于STM32cubemx的STM32F107vct6的代码生成,实验四串口与DMA
  16. typecho博客,typecho插件,typecho博客搭建
  17. Photoshop 渐变工具使用
  18. PhotoScan软件进行无人机数据处理流程
  19. 【ESP32 开发】ArduinoJson联合PSRAM解决 ESP32内存过小 无限重启的问题
  20. innosetup标准安装

热门文章

  1. android自带的nsd发现服务器,Android网络服务发现(NSD)协议的使用
  2. cmake (3)多个源文件aux_source_directory
  3. C++ Primer 5th笔记(chap 19 特殊工具与技术)使用 RTTI
  4. 初等数论--整除--公倍数一定是最小公倍数的倍数
  5. 密码技术应用--AES文件加解密
  6. 全局变量/static静态变量在section段中的分布
  7. 密码体制Feistel 密码的相关知识
  8. SegAttnGAN: Text to Image Generation with Segmentation Attention 论文解读
  9. Windows进程与线程学习笔记(二)—— 线程结构体
  10. 006 kkrunchy_Ryd之类FSG压缩壳