Java基础笔记:Day_15 线程通信

尚硅谷JAVA基础笔记吐血整理 第1章 JAVA语言概述第2章 基本语法第3章 数组形参:方法定义时,声明的小括号内的参数实参:方法调用时,实际传递给形参的数据方法的形参传递机制:值传递如果参数是基本数据类型,此时实参赋给形参的是实参真实存储的数据值如果参数是引用数据类型,此时实参赋给形参的是实参存储数据的地址值相同点:1、定义变量的格式:数据类型 变量名=变量值2、先声明后使用3、变量都有其作用域不同点:1、在类中声明的位置不同,属性直接定义在类的{}内,局部变量声明在方法内,方法形参,代码块内,构造器 形参、构造器内部的变量2、权限修 阅读详情

一、线程通信

1.生产者与消费者案例
在这里插入图片描述
分析案例:
①生产者和消费者应该操作共享的资源(实现方式)
②使用一个或多个线程来表示生产者
③使用一个或多个线程来表示消费者

代码实例:

//生产者类
public class Producer implements Runnable {
	private ProducerAndConsumer resource = null;

	public Producer(ProducerAndConsumer resource) {
		this.resource = resource;
	}

	public void run() {
		for (int i = 0; i < 50; i++) {
			if (i % 2 == 0) {
				resource.push("Mille", "Male");
			} else {
				resource.push("Felece", "Female");
			}
		}
	}
}
--------------------------------------------------------
//消费者类
public class Consumer implements Runnable {
	private ProducerAndConsumer resource = null;
	
	public Consumer(ProducerAndConsumer resource) {
		this.resource = resource;
	}

	@Override
	public void run() {
		for (int i = 0; i < 50; i++) {
			resource.popup();
		}
	}
}
--------------------------------------------------------
//共享资源对象(姓名 性别)
public class ProducerAndConsumer {
	private String name;
	private String gender;
	private boolean isEmpty = true;//表示共享资源对象是否为空的状态

	//push用于生产者向共享资源对象中存储数据
	synchronized public void push(String name, String gender) {
		//false:
		try {
			while (!isEmpty) {//当isEmpty为false的时候,不空,等着消费者来消费
				this.wait();//使用同步锁对象来调用当前线程释放同步锁,进入等待池中,只能被其他线程唤醒
			}
			this.name = name;
			Thread.sleep(10);
			this.gender = gender;

			isEmpty = false;//设置数据不为空

			this.notify();//唤醒一个消费者
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	//消费者从共享资源对象中取出数据
	synchronized public void popup() {
		try {
			while (isEmpty)//true时候,等待着生产者进行生产
			{
				this.wait();
			}
			//消费开始
			Thread.sleep(10);
			System.out.println(this.name + " " + this.gender);
			isEmpty = true;
			this.notify();//唤醒一个生产者
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}
--------------------------------------------------------
//测试类
public class DebugDemo {
	public static void main(String[] args) {
		ProducerAndConsumer resource = new ProducerAndConsumer();
		new Thread(new Producer(resource)).start();
		new Thread(new Consumer(resource)).start();
	}
}

wait():执行该方法的线程对象释放同步锁,JVM把该线程放到等待池中,等待其他的线程唤醒该线程。
notify():执行该方法的线程唤醒在等待池中等待的任意一个线程,把线程转到锁池中等待。
notifyAll():执行该方法的线程唤醒在等待池中等待的所有的线程,把线程转到锁池中等待.
注意:上述方法只能被同步监听锁对象来调用,否则报错IllegalMonitorStateException。

2.线程的生命周期

线程可以处于以下几种状态:
1.新建状态:使用new创建一个线程对象,仅仅在堆内存中分配空间而已,在调用start方法之前根本没有启动。
2.就绪状态:线程对象调用了start方法之后,等待jvm的调度,此时线程依然没有运行。
3.运行状态:线程对象获得了JVM的调度,如果存在多个CPU,那么允许多个线程并行运行。
4.阻塞状态:正在运行的线程因为某些原因放弃PCU,此时JVM不会给线程分配CPU直到线程重新进入就绪状态。
5.等待状态:此状态只能被其他线程唤醒,此时使用wait方法,使得JVM把当前线程存在对象等待池中。
6.死亡状态。

3.线程的操作
①sleep操作
线程休眠:让执行的线程暂停一段时间,进入计时等待状态。
方法:static void sleep(long millis)
调用sleep后,当前线程放弃CPU,在指定时间段之内,sleep所在线程不会获得执行的机会。
此状态下的线程不会释放同步锁/同步监听器.
该方法更多的用于模拟网络延迟,让多线程并发访问同一个资源的错误效果更明显.
在开发中也会故意使用该方法。

public class Demo{
	public static void main(String[] args) throws InterruptedException {
		for(int i = 10; i > 0 ; i--) {
			System.out.println("倒计时" + i);
			Thread.sleep(1000);
		}
		System.out.println("OK");
	}	
}

②join操作
联合线程:
线程的join方法表示一个线程等待另一个线程完成后才执行。join方法被调用之后,线程对象处于阻塞状态。
有人也把这种方式称为联合线程,就是说把当前线程和当前线程所在的线程联合成一个线程。

class Join extends Thread {
	public void run() {
		for (int i = 0; i < 20; i++) {
			System.out.println("Join" + i);
		}
	}
}

public class Demo {
	public static void main(String[] args) throws InterruptedException {
		System.out.println("Begin");
		Join joinThread = new Join();
		for (int i = 0; i < 50; i++) {
			System.out.println("main" + i);
			if (i == 10) {
				joinThread.start();
			}
			if (i == 20) {
				joinThread.join();//强制执行该线程
			}
		}
		System.out.println("End");
	}
}

在这里插入图片描述
③后台线程
后台线程:在后台运行的线程,其目的是为其他线程提供服务,也称为“守护线程"。JVM的垃圾回收线程就是典型的后台线程。
特点:若所有的前台线程都死亡,后台线程自动死亡,前台线程没有结束,后台线程是不会结束的。

比如:GC线程为后台线程,主线程为前台线程。
前台线程创建的子线程默认也是前台的,后台同样。
但是也可以设置。

class DemonThread extends Thread {
	public void run() {
		for (int i = 0; i < 500; i++) {
			System.out.println(super.getName() + i);
		}
	}
}

public class Demo {
	public static void main(String[] args) throws InterruptedException {

		System.out.println(Thread.currentThread().isDaemon());//false说明主线程是前台线程
		for (int i = 0; i < 50; i++) {
			System.out.println("main" + i);
			if (i == 10) {
				DemonThread t = new DemonThread();
				t.setDaemon(true);//设置为后台线程
				t.start();//
			}
		}
	}
}

前台线程结束之后,后台线程也会随之结束。但是并不会立即结束。

线程优先级:
每个线程都有优先级,优先级的高低只和线程获得执行机会的次数多少有关,并非线程优先级越高的就一定先执行,哪个线程的先运行取决于CPU的调度。
MAX_PRIORITY=10,最高优先级
MIN_PRIORITY=1,最低优先级
NORM_PRIORITY=5,默认优先级

int getPriority() :返回线程的优先级。
void setPriority(int newPriority) : 更改线程的优先级。

每个线程都有默认优先级,主线程默认优先级为5,如果A线程创建了B线程,那么B线程和A线程具有相同优先级.
注意:不同的操作系统支持的线程优先级不同的,建议使用上述三个优先级,不要自定义.

Java零基础之多线程篇:线程间如何通信? 随着计算机技术的发展,多线程编程已经成为现代软件开发中的一个重要方向。在多线程编程中,线程间的通信是一个非常关键的问题。在Java开发语言中,Java提供了一些机制来实现线程间的通信,帮助开发者协调不同线程之间的执行顺序和数据交换。本文将介绍Java多线程编程中的线程间通信的相关知识。首先,我们将从简介开始,介绍线程间通信的基本概念和原理。然后,我们将通过源代码解析的方式,深入探讨Java中实现线程间通信的方法。接着,我们将给出一些应用场景案例,展示线程间通信在实际开发中的应用。 阅读详情

相关推荐

STM32在六轴机械臂实时控制中的选型与分层架构设计

嵌入式实时控制系统中,微控制器的选型直接决定运动控制精度与系统可靠性。其核心在于匹配确定性中断响应、低延迟外设协同与工业协议栈支持等硬性指标。STM32凭借Cortex-M内核的NVIC调度能力、成熟HAL库及CAN FD/高级定时器等专用外设,在机电一体化场景中成为伺服控制中枢的首选。相比ESP32等通用MCU,STM32在硬实时性、EMC认证生态和工业总线兼容性上具备不可替代优势。本文围绕GTB六轴机械臂项目,详解基于STM32F407的硬件抽象层配置、FreeRTOS任务调度、事件队列解耦及闭环控制数

jupi8的博客 754

【JAVA-Day80】多线程通信

在 Java 开发中,多线程通信是一项至关重要的技术。通过多线程通信,不同的线程可以有效地交换信息和协调任务,从而提高程序的效率和性能。本篇博客将深入探讨多线程通信的概念、实现方法、应用场景以及常见面试题,帮助读者更好地理解和应用多线程编程。多线程是指在同一时间内,多个线程同时执行不同的任务。相比于单线程程序,多线程程序能够更充分地利用 CPU 资源,提高程序的并发性和响应性。在 Java 中,可以通过Thread类或者实现Runnable接口来创建和管理线程。

沉淀所学,分享所思,让热爱与成长同行。商务记录AI实战经验,助力开发者快速成长。 热爱AI,希望做出有影响力的技术成果。 技术点亮生活,分享连接价值与机会。 专注AI落地实战,陪你走好技术每一步。 2万+

当AI换脸遇上内容审核:Facefusion NSFW检测的技术伦理与用户自主权之争

本文探讨了Facefusion开源AI换脸工具中NSFW检测机制的技术伦理困境与用户自主权之争。分析了其多层次防御机制的技术实现与社区规避方法,揭示了开源软件在安全与自由之间的平衡难题,并提出了分层权限设计等社区实践方案。

weixin_29165725的博客 678

Day39 | Java线程通信的两种方式

本文详细讲解了Java中线程协作的两种方式:1)使用synchronized配合Object的wait/notify机制,通过生产者-消费者模型演示了线程如何在共享资源上协作;2)使用ReentrantLock配合Condition接口,通过创建多个等待队列实现更精细化的线程控制。两种方式都能实现线程间的通信与协调,但Condition提供了更灵活的等待/唤醒机制,可以精准控制特定条件下的线程唤醒,减少不必要的上下文切换。文章通过包子铺案例对比了两种实现方式的代码差异,帮助读者理解多线程协作的核心机制。

懒惰蜗牛的博客 1033

【WorkBuddy】WorkBuddy 智能体快速上手:从零到一的实践指南

文章摘要: 传统自动化脚本难以应对灵活多变的自然语言需求,导致逻辑复杂、维护成本高。智能体(Agent)通过理解语义意图、动态决策和松耦合组件解决了这些问题。WorkBuddy采用声明式配置,通过可视化界面定义意图、实体和对话策略,无需编码即可快速构建智能体。其核心组件包括意图分类、实体提取、对话策略、故事样本和回退机制,适用于客服支持、知识问答等高频场景。通过环境准备(Python/Node.js/Redis)和简单配置,用户可以快速搭建可运行的智能体,显著提升自动化效率。

ruiqideng的博客 1616

pyautogui库详细教程,逐行注释(附项目实战:基于图像识别实现崩坏星穹铁道自动化测试)

本文包含了pyautogui的使用方法与常见问题指南,随文附带对游戏实现的自动化项目源码与说明文档

m0_53043024的博客 1万+

Java并发编程实战 Day 4:线程间通信机制

线程间通信(Inter-Thread Communication)是指多个线程通过共享变量或特定机制交换信息,以协调彼此的行为。等待通知:一个线程需要等待另一个线程完成某项工作后才能继续执行。资源协调:多个线程共同访问共享资源时,需按某种规则控制访问顺序。状态同步:多个线程需要根据某个共享状态的变化来调整自己的行为。:经典的线程通信方式,适用于简单同步场景。Condition:基于的高级条件控制机制,提供更灵活的线程协作方式。:用于控制多个线程的启动或结束,适合一次性事件触发。

在未来等你的专栏 831

头歌操作系统 课后作业4.3:段页式内存管理 答案 无解析

头歌操作系统 课后作业4.3:段页式内存管理 答案 无解析

kercii的博客 7343

Java尚硅谷基础笔记-day9多线程

第八章 多线程8.1 基本概念:程序,进程,线程8.2 线程的创建和使用8.3 线程的生命周期8.4 线程的同步8.5 线程的通信8.6 JDK5.0新增线程创建方式 8.1 基本概念:程序,进程,线程 每个线程都有独立的栈,程序计数器 多个线程共享同一个进程中的结构:方法区,堆 一个Java应用程序java.exe,其实至少有三个线程: main()主线程, gc()垃圾回收线程,异常处理线程。当然如果发生异常,会影响主线程。 单核CPU(假的多线程,一个时间单元内只能执行一个线程任务)与多核CPU

alyja的博客 696

pgsql行列转换

‌是PostgreSQL中的一个函数,用于将一个字符串根据正则表达式进行分割,并将结果返回为一个表格,每个分割后的部分作为一行‌‌。string_agg() 函数是 PostgreSQL 中的一个聚合函数,用于将一个列中的值连接成一个字符串。

chimchim66的博客 3501

TIP 2024 | 跨类与跨域语义增强用于域泛化

域泛化方法旨在通过多样化的源域帮助开发一个在未知目标域上表现良好的通用模型。数据增强已被证明是增强计算机视觉中域泛化的有效方法。最近,基于语义级别的数据增强取得了显著成果。然而,这些方法主要集中在从类内和域内采样语义方向,限制了源域的多样性。为了解决这个问题,作者提出了一种新的方法,称为跨类与跨域语义增强(CDSA)。首先,作者引入了一种基于采样的方法CrossSmooth,从跨类中获取语义方向。然后,CrossVariance通过采样语义方向获取不同域的样式。

小白学视觉 210

【进阶篇-Day15:JAVA线程-Thread的介绍】

上述三种方法,最推荐第二种,尤其使用匿名内部类的方式很方便。如果需要返回值的话,那就只能选择第三种方法了。下面看看一个线程的生命周期流程图:/*** JDK自带线程池* Executors 中提供静态方法来创建线程池* static ExecutorService newCachedThreadPool() 创建一个默认的线程池* static newFixedThreadPool(int nThreads) 创建一个指定最多线程数量的线程池*///1、获取线程池。

Ma Sizhou 1145

31、双相不锈钢直齿轮加工与性能研究及人工神经网络在焊接中的应用

本文研究了双相不锈钢直齿轮在不同加工方法(WEDM与滚齿加工)下的磨损行为,分析了表面粗糙度、齿厚变化、磨损率及润滑性能随转速的变化规律,并对比了两种工艺的优劣。同时,探讨了人工神经网络(ANN)在AA7050铝合金搅拌摩擦焊中的应用,通过建立工艺参数与焊接质量之间的预测模型,实现了对焊缝硬度和峰值温度的准确预测。研究为高性能齿轮制造和铝合金焊接提供了理论支持和技术参考,并提出了未来在润滑优化、加工工艺改进及智能控制方面的研究方向。

ggg99的专栏 150

Java基础——线程(线程通信、线程生命周期、线程池、单列设计模式)

确保线程能够按照预定的顺序执行,并且能够安全地访问共享资源,使多条线程更好的进行协同工作。

qq_38553011的博客 1917

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

JAVA基础学习笔记-day09-多线程

Java语言的JVM允许程序运行多个线程,使用类代表线程,所有的线程对象都必须是Thread类或其子类的实例。Thread类的特性每个线程都是通过某个特定Thread对象的run()方法来完成操作的,因此把run()方法体称为线程执行体。通过该Thread对象的start()方法来启动这个线程,而非直接调用run()要想实现多线程,必须在主线程中创建新的线程对象。

天才在左,疯子在右,而我只想做个不折不扣的乐天派 190

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

JAVA基础 day12 线程通信,线程池

线程通信 sleep和wait的区别 1.sleep是线程进入休眠状态,wait线程进入等待队列等待 2.sleep释放cpu了,没有释放锁;wait释放cpu了,释放锁 锁.wait() 会抛出异常,用try,catch捕捉 锁.notify() 锁.notify() 调用某个对象的notify()方法能够唤醒一个正在等待这个对象的锁的线程, wait()方法与notify()必须要与synchronized(resource)一起使用。也就是wait与notify针对已经获取了resource锁的

weixin_46147057的博客 332

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Day25 Java 线程之间的通信

多线程(续) Lock锁 同步代码块和同步方法虽然解决了线程安全问题,但表达不出在哪里加了锁,在哪里释放了锁,所以在JDK1.5之后提供了一个新的锁对象:Lock Lock是一个接口,其中有两个方法: void lock():加锁 ;void lock():释放锁 在创建Lock对象需要使用他的实现类:ReentrantLock 以电影院卖票为例:也就是解决线程安全问题的第二种方式 import java.util.concurrent.locks.Lock; import java.uti

m0_64350718的博客 282

day22——Java多线程编程全面指南:从基础到高级应用

线程创建:优先选择实现Runnable或Callable接口线程安全:同步范围最小化,推荐使用Lock锁线程协调:使用wait/notify实现生产者-消费者模式资源管理:始终使用线程池管理线程资源状态监控:关注线程生命周期状态转换。

白元霞的博客 1113

Day24_8 Java学习之线程池、网络编程及TCP通信程序

解析:1.通过前面的文章讲述想必大家都知道了什么是线程,由于在使用线程时,若我们并发的线程及多,一个线程完成一个任务之后就死亡销毁,这样频繁的创建销毁是非常的消耗时间资源的,会极大的降低程序运行效率。2.为了解决上述的问题,就有了线程池。线程池:就是根据程序的运行需求先创建好N条线程放在线程池中等待,在需要时才随机的从池中抽取线程进行任务,任务完成后又回到线程池变成等待的空闲状态,这样会极大的提高效率。3.合理利于线程池带来的好处:3.1降低资源消耗。

weixin_43717536的博客 837

day04 多线程 java基础篇

目录 一、基本概念 二、线程状态 三、线程练习 四、同步线程 五、Java锁对象 六、线程的通信 七、线程停止 八、守护线程 九、Join方法(加入) 一、基本概念 package day.day.up; /* 多线程:一个程序进程中多个执行路径同时执行 进程 : 正在执行的程序称作为一个进程。 进程负责了内存空间的划分。 问题: windows...

RONG_YAO的博客 374

day15 线程协作、线程通信

线程通信、生产者消费者模式、管程法、信号灯法

m0_51635935的博客 464

JAVA——Day 15线程、同步与死锁

线程 多线程的创建与启动 Thread类 package day15; public class ThreadMethodLearn { public static void main(String[] args) { Thread t3 = new Thread(new testT()); System.out.println(t3.getName()); t3.setNa...

YiRenGengShangBuQi的博客 202

Day_16 【Java基础】多线程、线程通信、线程安全和线程池【附源码】

一.什么是程序、进程、线程? 程序:就是用编程语言编写的一段静态的代码。 进程:一个正在运行的应用程序 线程:一个程序内部的一条执行路径 线程、进程根本区别: ① 进程是资源分配的基本单位,而线程是处理器任务调度和执行的基本单位; ② 一个进程可以由多个进程组成,但是一个线程只能属于一个进程; ③ 每个线程拥有自己独立的栈、程序计数器(pc),多个线程共享一个进程的结构和资源:堆、方法区 **并行:**多个cpu同时执行多个任务 **并发:**一个cpu(采用时间片)同时执行多个任务,如:秒杀 二.进程的创

weixin_46081857的博客 507

Day65.线程的通信 -Java多线程

线程的通信 /** * 线程通讯的例子: 使用两个线程打印1-100。线程1,线程2 交替打印 * * 涉及到的3个方法: * 1. wait(): 一旦执行此方法,当前线程就进入阻塞状态。并释放同步监视器。 * 2. notify(): 一旦执行此方法,就会唤醒被wait的一个线程。如果有多个线程被wait,就唤醒优先级高的线程。 * 3. notifyAll(): 一旦执行此方法,就会唤醒被所以wait的线程。 * * 说明: * 1. wait(),notify(),not

阿昌爱Java 391
上一篇: Java基础笔记:Day_14 多线程与synchronized
下一篇: Java基础笔记:Day_16 集合框架
Panda不姓潘
博客等级 码龄8年 152粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值