1 package bytezero.threadcommunication;
2
3 /**
4 * 线程通信的例子:使用俩个线程打印1-100.线程1 线程2 交替打印
5 *
6 * 涉及到的三个方法:
7 * wait(); 一旦执行此方法,当前线程就进入了阻塞状态,并释放同步监视器
8 * notify(); 一旦执行此方法,就会唤醒被wait的一个线程,如果有多个线程被wait,就
9 * 唤醒优先级高的线程
10 * notifyAll(); 一旦执行此方法,就会唤醒被wait的所有线程
11 *
12 *说明:
13 * 1.wait();notify(); notifyAll(); 这三个方法必须使用在同步代码块或同步方法中。
14 * 2.wait();notify(); notifyAll();这三个方法调用者必须是同步代码块或同步方法的
15 * 同步监视器,否则会出现 IllegalMonitorStateException异常
16 *3.wait();notify(); notifyAll();这三个方法定义在 java.lang.Object类中。
17 *
18 * 面试题:slepp() 和 wait()的异同?
19 * 1.相同点:一旦执行方法,都可以使得当前线程进入阻塞状态
20 * 2.不同点:1)两个方法声明的位置不同:Thread类中声明sleep(),Object类声明wait()
21 * 2)调用的要求不同:sleep(); 可以在任何需要的场景下调用
22 * wait()必须使用在同步代码块或同步方法中
23 * 3)关于是否释放同步监视器:如果两个方法都使用在同步代码块或同步方法中,
24 * sleep() 不会释放 同步监视器,wait()会释放同步监视器
25 * @author Bytezero1·zhenglei! Email:420498246@qq.com
26 * create 2021-10-18 15:29
27 */
28
29 class Number implements Runnable{
30 private int number = 1;
31 private Object obj = new Object();
32
33 @Override
34 public void run() {
35 while (true){
36 synchronized (this) {
37 this.notify();
38
39 if(number <= 100){
40 try {
41 Thread.sleep(100);
42 } catch (InterruptedException e) {
43 e.printStackTrace();
44 }
45
46 System.out.println(Thread.currentThread().getName()+":"+number);
47 number++;
48
49 try {
50 //使得调用如下 wait()方法的线程进入阻塞状态
51 wait();
52 } catch (InterruptedException e) {
53 e.printStackTrace();
54 }
55
56 }else{
57 break;
58 }
59 }
60 }
61
62 }
63 }
64 public class CommunicationTest {
65 public static void main(String[] args) {
66 Number number = new Number();
67 Thread t1 = new Thread(number);
68 Thread t2 = new Thread(number);
69
70 t1.setName("线程1");
71 t2.setName("线程1");
72
73 t1.start();
74 t2.start();
75 }
76 }

Java 线程通信 例子:使用俩个线程打印1-100.线程1 线程2 交替打印的更多相关文章

  1. java多线程通信 例子

    package com.cl.www.thread; public class NumberHolder { private Integer number = 0; // 增加number publi ...

  2. JAVA基础知识之多线程——线程通信

    传统的线程通信 Object提供了三个方法wait(), notify(), notifyAll()在线程之间进行通信,以此来解决线程间执行顺序等问题. wait():释放当前线程的同步监视控制器,并 ...

  3. 关于Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇高质量的博文)

    Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇质量高的博文) 前言:在学习多线程时,遇到了一些问题,这里我将这些问题都分享出来,同时也分享了几篇其他博客主的博客,并且将我个人的理解也分享 ...

  4. JAVA多线程提高二:传统线程的互斥与同步&传统线程通信机制

    本文主要是回顾线程之间互斥和同步,以及线程之间通信,在最开始没有juc并发包情况下,如何实现的,也就是我们传统的方式如何来实现的,回顾知识是为了后面的提高作准备. 一.线程的互斥 为什么会有线程的互斥 ...

  5. Java并发——线程安全、线程同步、线程通信

    线程安全 进程间"共享"对象 多个“写”线程同时访问对象. 例:Timer实例的num成员,即add()方法是用的次数.即Timer实例是资源对象. class TestSync ...

  6. Java多线程-同步:synchronized 和线程通信:生产者消费者模式

    大家伙周末愉快,小乐又来给大家献上技术大餐.上次是说到了Java多线程的创建和状态|乐字节,接下来,我们再来接着说Java多线程-同步:synchronized 和线程通信:生产者消费者模式. 一.同 ...

  7. Qt中跨进程Socket通信以及socket跨线程通信

    一 QTcpServer 创建流程 创建套接字服务器 QTcpServer 对象, 通过 QTcpServer 对象设置监听,即:QTcpServer::listen() 基于 QTcpServer: ...

  8. java多线程-线程通信

    线程通信的目标是使线程间能够互相发送信号.另一方面,线程通信使线程能够等待其他线程的信号. 通过共享对象通信 忙等待 wait(),notify()和 notifyAll() 丢失的信号 假唤醒 多线 ...

  9. Java核心知识点学习----使用Condition控制线程通信

    一.需求 实现线程间的通信,主线程循环3次后,子线程2循环2次,子线程3循环3次,然后主线程接着循环3次,如此循环3次. 即:A->B->C---A->B->C---A-> ...

  10. java多线程基本概述(五)——线程通信

    线程之间的通信可以通过共享内存变量的方式进行相互通信,也可以使用api提供的wait(),notify()实现线程之间的通信.wait()方法是Object类的方法,改方法用来将当前的线程置入&quo ...

随机推荐

  1. mac中virtualBox添加主机网络报错VBoxNetAdpCtl: Error while adding new interface: failed to open /dev/vboxnetctl: No such file or directory

    mac中virtualBox添加主机网络报错 现场复原 解决方法 参考 mac中virtualBox添加主机网络报错 现场复原 virtual box添加主机网络报错 VBoxNetAdpCtl: E ...

  2. 数据挖掘机器学习[七]---2021研究生数学建模B题空气质量预报二次建模求解过程:基于Stacking机器学习混合模型的空气质量预测{含码源+pdf文章}

    相关文章: 特征工程详解及实战项目[参考] 数据挖掘---汽车车交易价格预测[一](测评指标:EDA) 数据挖掘机器学习---汽车交易价格预测详细版本[二]{EDA-数据探索性分析} 数据挖掘机器学习 ...

  3. 【三】tensorboard安装、使用教学以及遇到的问题

    相关文章: [一]tensorflow安装.常用python镜像源.tensorflow 深度学习强化学习教学 [二]tensorflow调试报错.tensorflow 深度学习强化学习教学 [三]t ...

  4. 使用 docker 部署 kafka

    在很多时候我们需要使用到消息队列, 其中 kafka 是一个非常优秀的消息队列, 在我们平时开发中也经常会用到, 但是在开发环境中部署 kafka 是一个非常麻烦的事情 在 kafka 官网上, 有一 ...

  5. 遥感图像处理笔记之【Automatic Flood Detection from Satellite Images Using Deep Learning】

    遥感图像处理学习(7) 前言 遥感系列第7篇.遥感图像处理方向的学习者可以参考或者复刻 本文初编辑于2023年12月29日 2024年1月24日搬运至本人博客园平台 文章标题:Automatic Fl ...

  6. linux笔记-工作

    根据进程id或进程名查看端口号 netstat -antup|grep 2073 netstat -antup|grep processName 查看某个端口号是否被占用 netstat -tln | ...

  7. 硬盘SMART信息解读

    目录 一.SMART概述        4 二.SMART的ID代码        4 三.SMART的描述(Description)        5 四.SMART的值        5 1.临界 ...

  8. Git 简明教程(一)

    版本控制工具,早期的vss tfs svn等,这些应该是老一辈程序员常用的工具.目前 git 已经在版本控制领域占主流的地位,因为国外的github 和国内的码云 gitee 均用的是git. git ...

  9. webrtc终极版(题外话)辛苦写文章分享,竟然遇到喷子狂喷,写篇文章回怼下,顺便发表下面对喷子的处理方式

    webrtc终极版(题外话)辛苦写文章分享,竟然遇到喷子狂喷,写篇文章回怼下,顺便发表下面对喷子的处理方式 第一篇文章发过后,出人意料的是,收到了博客园某一位用户的狂喷[注:本系列文章会同步发布到cs ...

  10. 一文搞懂 Vue3 defineModel 双向绑定:告别繁琐代码!

    前言 随着vue3.4版本的发布,defineModel也正式转正了.它可以简化父子组件之间的双向绑定,是目前官方推荐的双向绑定实现方式. vue3.4以前如何实现双向绑定 大家应该都知道v-mode ...