Java 线程通信 例子:使用俩个线程打印1-100.线程1 线程2 交替打印
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 交替打印的更多相关文章
- java多线程通信 例子
package com.cl.www.thread; public class NumberHolder { private Integer number = 0; // 增加number publi ...
- JAVA基础知识之多线程——线程通信
传统的线程通信 Object提供了三个方法wait(), notify(), notifyAll()在线程之间进行通信,以此来解决线程间执行顺序等问题. wait():释放当前线程的同步监视控制器,并 ...
- 关于Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇高质量的博文)
Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇质量高的博文) 前言:在学习多线程时,遇到了一些问题,这里我将这些问题都分享出来,同时也分享了几篇其他博客主的博客,并且将我个人的理解也分享 ...
- JAVA多线程提高二:传统线程的互斥与同步&传统线程通信机制
本文主要是回顾线程之间互斥和同步,以及线程之间通信,在最开始没有juc并发包情况下,如何实现的,也就是我们传统的方式如何来实现的,回顾知识是为了后面的提高作准备. 一.线程的互斥 为什么会有线程的互斥 ...
- Java并发——线程安全、线程同步、线程通信
线程安全 进程间"共享"对象 多个“写”线程同时访问对象. 例:Timer实例的num成员,即add()方法是用的次数.即Timer实例是资源对象. class TestSync ...
- Java多线程-同步:synchronized 和线程通信:生产者消费者模式
大家伙周末愉快,小乐又来给大家献上技术大餐.上次是说到了Java多线程的创建和状态|乐字节,接下来,我们再来接着说Java多线程-同步:synchronized 和线程通信:生产者消费者模式. 一.同 ...
- Qt中跨进程Socket通信以及socket跨线程通信
一 QTcpServer 创建流程 创建套接字服务器 QTcpServer 对象, 通过 QTcpServer 对象设置监听,即:QTcpServer::listen() 基于 QTcpServer: ...
- java多线程-线程通信
线程通信的目标是使线程间能够互相发送信号.另一方面,线程通信使线程能够等待其他线程的信号. 通过共享对象通信 忙等待 wait(),notify()和 notifyAll() 丢失的信号 假唤醒 多线 ...
- Java核心知识点学习----使用Condition控制线程通信
一.需求 实现线程间的通信,主线程循环3次后,子线程2循环2次,子线程3循环3次,然后主线程接着循环3次,如此循环3次. 即:A->B->C---A->B->C---A-> ...
- java多线程基本概述(五)——线程通信
线程之间的通信可以通过共享内存变量的方式进行相互通信,也可以使用api提供的wait(),notify()实现线程之间的通信.wait()方法是Object类的方法,改方法用来将当前的线程置入&quo ...
随机推荐
- springboot security 权限控制 -- @PreAuthorize 的使用
1. 说明 security 鉴权方式常用的有两种配置,1.配置文件中配置:2.使用注解标注:他们都是基于 acess 表达式,如果需要自定义逻辑的鉴权认证,只需要自定义 access 表达式即可.本 ...
- go中的类型转换成interface之后如何复原
go中interface转换成原来的类型 首先了解下interface 什么是interface? 如何判断interface变量存储的是哪种类型 fmt 反射 断言 来看下interface的底层源 ...
- 5.13 汇编语言:仿写For循环语句
循环语句(for)是计算机编程中的一种基本控制结构,它允许程序按照指定的次数或范围重复执行一段代码块.for循环在处理需要进行迭代操作的情况下非常有用,它使得程序可以更加方便地控制循环的次数.一般来说 ...
- C/C++ 感染标志与空字节感染
C/C++ 通过搜索PE结构中的空隙部分,对指定文件写入感染标志,作用是,如果程序被感染过则不再继续感染,而搜索空字节,则是要将恶意代码动态的填充到可执行文件中,并劫持执行流,以下代码就是这两种代码的 ...
- 技嘉水雕II 360水冷散热器评测:稳压340W i9-14900K
一.前言:极简卡扣连锁风扇设计 再多风扇也只需2根线 如今这个年代,DIY主机几乎都会配大量的RGB风扇,然而"光污染"虽然带来了视觉感官享受,在理线方面却非常繁琐. 就拿360水 ...
- U390630 分考场题解
题目链接:U390630 分考场 本题来自于2019年蓝桥杯国赛的题.在洛谷上也被标为了假题.原因是首先官方在需要输出浮点数的情况下,并没有开启spj,并且官方所给的数据当中,总有一两个数据以不知道到 ...
- C++中,new与malloc的区别何在?(代码实验向)
在C++中,new与malloc()都可用于在堆中分配一块内存.其中,new是C++的语法,而malloc则来自古老的C语言,二者在使用时有何区别? new会调用构造函数,而malloc()不会 假设 ...
- require 与 import
common.js 模块化规范 app.js 文件: // require 在代码执行阶段才会调用引入文件,编译(预解析)时不会执行,所以下面会报错 // console.log(dep); Re ...
- npm i -D和-s及-g以及--save的那些事
i 是 install 的简写 -S 就是 --save 的简写 -D 就是 --save-dev 的简写 npm i module_name -S = > npm install modu ...
- Spring boot 的定时任务。
@Scheduled(fixedRate=2000):上一次开始执行时间点后2秒再次执行: @Scheduled(fixedDelay=2000):上一次执行完毕时间点后2秒再次执行: @Schedu ...