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. js 删除数组中的某一个内容

    <script type="text/javascript"> let list=["为","啊发大水","阿斯蒂芬& ...

  2. 无参数RCE

    三种绕过姿势 gettallheaders() get_defined_vars() session_id() 题目情景 <?php if(';' === preg_replace('/[a-z ...

  3. 关于Curl命令的使用

    最常用的curl命令 1.发送GET请求 curl URL 例: curl URL?a=1&b=nihao 2.发送POST请求 curl -X POST -d 'a=1&b=niha ...

  4. PE结构:VA&RVA&FOA 转换复习

    复习一下,不然会忘 1.imagebase 映像基地址 ,默认是0x400000 2.va 虚拟地址,载入OD后的地址,已经映射到内存的地址. 计算实际装入地址 VA imagebase (映像基址) ...

  5. 离线解锁 CodeCombat 全关卡教程 使用docker安装实现

    前期准备 下载安装docker desktop https://www.123pan.com/s/fmvUVv-HqApH, 这个安装不会的随便搜一个教程,挺多的.我随便找了一个知乎的 Windows ...

  6. 从TF-IDF 到BM25, BM25+,一文彻底理解文本相关度

    相关性描述的是⼀个⽂档和查询语句匹配的程度.我们从搜索引擎召回时,肯定希望召回相关性高的数据,那么如何来量化相关度呢. 首先,我们定义,一个文档doc,由多个词语 term 组成. 最早,通过最简单的 ...

  7. (C语言)每日代码||2023.12.24||printf换行的三种方法

    #include <stdio.h> int main() { //printf()函数不同参数间可以换行 printf("num one : %d,num two : %d&q ...

  8. Linux离线安装MySQL(5.7.22)

    1.下载tar包 (1)Window PC下载(PC需要联网) MySQL官网地址:https://www.mysql.com/ MySQL社区版下载地址: https://dev.mysql.com ...

  9. 沿SVG路径的颜色渐变

    原生的渐变方法 在SVG中提供的原生渐变方法有两种,分别为线性渐变linearGradient和径向渐变radialGradient.我们以一个稍微复杂的路径来作为模板,为其添加两种渐变效果: < ...

  10. JS Leetcode 278. 第一个错误的版本 题解分析

    壹 ❀ 引 本题来自LeetCode的278. 第一个错误的版本,难度简单,端午节就应该做点容易的题目缓解心情,题目描述如下: 你是产品经理,目前正在带领一个团队开发新的产品.不幸的是,你的产品的最新 ...