线程的四种创建方式和三种同步方式

ESP8266 + MQTT :如何实现 LED 灯的远程控制 MQTT 是轻量级的、灵活的物联网消息交换和数据传递协议,致力于为 IoT 开发人员实现灵活性与硬件/网络资源的平衡。 NodeMCU 是一个开源的物联网平台。它使用 Lua 语言编程。该平台基于eLua开源项目,底层使用ESP8266 sdk 0.9.5版本。 在此项目中我们将实现 NodeMCU(ESP8266) 与 EMQ X Cloud 运营和维护的免费公共 MQTT 服务器远程控制 LED 灯,并使用 Arduino IDE 来对 NodeMCU ESP8266 进行编程。 EMQ X Cloud 阅读详情

引入
进程:简单的理解进程就是一个应用程序
线程: 就是进程的最小执行单位,是一个独立的功能

多线程作用:
1、为了利用计算机的多核心优势
2、提高程序运行效率

创建方式
一、继承Thread类
步骤:
1、写一个线程类XxxThread extends Thread类
2、重写run()方法
3、写一个测试类,在测试类中创建线程对象—>调用对象的start()启动线程

二、实现Runnable接口
步骤:
1、写一个实现业务类XxxRunnableImpl implements Runnable接口
2、重写run()方法
3、写一个测试类,在测试类中先创建业务类对象—>再通过构造方法创建线程对象(业务类对象)—>调用线程对象的start()启动线程

注意事项:
1、只有继承Thread类的子类才能叫线程类,实现Runnable接口的子类叫业务类
2、启动线程类是两步:创建对象—>对象.start(),
启动业务类是三步:创建业务类对象—>创建线程对象(业务类对象)—>线程对象.start()
3、start()会去执行线程里的run()方法,但只有start()才是启动线程,run()只是在执行方法
在这里插入图片描述

====================================================================

同步方式
一、悲观锁(以最坏的情况做打算)
1、同步代码块

synchronized(同步对象){
		//有线程安全问题的代码;
}
//注意事项:作为同步对象需要满足的条件:只有一份(静态区中的静态成员或元空间中的字节码文件)

2、同步方法
用synchronized关键字修饰方法即可,写在返回值前面,方法体里是有线程安全问题的代码

注意事项:因为创建业务类对象只需要一个,然后通过创建线程类对象来启动
1、若是继承类使用同步代码块,通过同步对象控制共享,所以必须是只有一份的;若是业务类,this即可
2、若是继承类使用同步方法,方法必须要static修饰;若是业务类,就不要求

二、乐观锁
锁机制:Lock接口的实现类ReentrantLock
构造方法:

  1. ReentrantLock() 创建一个 ReentrantLock的实例,获取锁的几率不同
  2. ReentrantLock(boolean fair) 根据给定的公平政策创建一个 ReentrantLock的实例。 理论上获取锁的几率是相同的
class X {
	//1.创建一个 ReentrantLock的实例。不要公平机制,效率高
	private final ReentrantLock lock = new ReentrantLock();

	/**
	* 在run()中进行调用
	*/
	public void m() {
	    lock.lock();  // 上锁
	     try {
	       	//有线程安全问题的代码
	     } finally {
	       lock.unlock();//释放锁,不然后面其他线程无法执行代码
	     }
	}
}

注意事项:
1、悲观锁和乐观锁是一个总称,不仅仅包括这三种方法
2、锁原则:最小范围原则(锁住的代码块最小化),为了保证执行效率,锁机制效率高且功能更加强大,建议使用
3、同步方法最简单,如果能够满足性能要求,建议使用同步方法

==============================================================
经典案例:多窗口售票(继承类+代码块)
案例描述:总票数:50,三个窗口同时售卖

继承类:

public class SaleTicketTread extends Thread {
	private static int ticket=50;

	public SaleTicketTread() {
		super();
	}
	
	/**
	 * 给线程起名,为了打印看输出方便
	 * @param name
	 */
	public SaleTicketTread(String name) {
		super(name);
	}

	@Override
	public void run() {
		while (ticket>0) {
			sale();
		}
	}

	private void sale() {
		synchronized (SaleTicketTread.class) {//只有一份的对象
			if (ticket>0) {//虽然锁住了,但是还是会出现多个线程同时进入run,ticket未--,所以在下一个线程执行售票之前,先判断ticket是否卖光
				System.out.println(Thread.currentThread().getName()+",票号:"+ticket);
				ticket--;
			}
		}
	}
}

测试类

public class TicketTest {

	public static void main(String[] args) {
		SaleTicketTread ticket1= new SaleTicketTread("窗口1");
		SaleTicketTread ticket2= new SaleTicketTread("窗口2=====");
		SaleTicketTread ticket3= new SaleTicketTread("窗口3=========");
		
		ticket1.start();
		ticket2.start();
		ticket3.start();
	}
}

问题代码分析:为何需要if (ticket>0)
在这里插入图片描述

YOLO11改进 | 卷积模块 | 轻量化GSConv替换普通的conv yolo11,GSConv,卷积模块 阅读详情

相关推荐

对极几何 —两相机相对位置关系与相机姿态估计方法(基础矩阵,本征矩阵,单应矩阵梳理)附c++源码

对极几何 —两相机相对位置关系与相机姿态估计方法(基础矩阵,本质矩阵,单应矩阵梳理)附c++源码对极几何是什么,它有什么用(整体流程理解)对极约束(描述两相机关系)基础矩阵特性与求解方法本质矩阵特性与求解方法相机姿态恢复方法怎么又冒出了个单应矩阵H? 对极几何是什么,它有什么用(整体流程理解) 如图,当空间上有一个点分别在相机1和相机2上进行成像,这两个点存在什么变换关系呢?再扩展一下,真实世界下的场景分别用两个相机进行拍摄,获得两张照片,两张照片有什么变换关系呢?那么对极几何就是用来描述这种变换关系的。

qq_37764141的博客 5104

线程的创建方式

1、继承 Tread类, 重写 run方法2、实现 Runnable接口,实现 run方法3、实现 Callable接口,实现 call方法,该方式可以获取线程的执行结果。

weixin_46760166的博客 9451

新手必看:LiteRadio 2c SE遥控器从开箱到飞行的完整指南(附常见问题解答)

本文为新手提供LiteRadio 2c SE遥控器的完整使用指南,涵盖从开箱到首飞的20个关键步骤。详细介绍了遥控器的功能设置、与无人机的对频技巧以及首飞注意事项,帮助用户快速掌握飞行控制,避免常见错误。特别适合无人机初学者阅读。

weixin_29209801的博客 380

创建线程的几种方式

创建线程的几种方式

inexaustible的博客 3199

电容式麦克风:从原理到实际电路波形解析

本文深入解析电容式麦克风的工作原理,从核心的振膜与背板结构、电荷锁定机制到场效应管放大器的作用。通过实物拆解与等效电路分析,阐明声音振动如何转换为电压信号,并指导如何用示波器实测波形,直观展现声电转换过程,适合电子爱好者和音频技术学习者。

Black的专栏 1080

基于python的奥运会历史数据分析【120年】

数据分析实战案例

xff123456_的博客 3338

创建线程三种方法

null :池中一直保持的线程的数量,即使线程空闲也不会释放。除非设置了 allowCoreThreadTimeOut *池中允许的最大的线程数当线程数大于核心线程数的时候,线程在最大多长时间没有接到新任务就会终止释放, 最终线程池维持在 corePoolSize 大小时间单位阻塞队列,用来存储等待执行的任务,如果当前对线程的需求超过了 corePoolSize大小,就会放在这里等待空闲线程执行。创建线程的工厂,比如指定线程名等。

一个菜鸡的博客 5958

MACS2软件进行Peak calling

MACS2可以检出ChIP-Seq,ATAC-seq 以及 MeRIP-seq (RNA甲基化测序) 等富集的序列。peaks calling 有不同的方法,MACS2是最常用的call peaks工具。 MACS全称Model-based Analysis of ChIP-Seq,最初的设计是用来鉴定转录因子的结合位点,但是它也可以用于其他类型的富集方式测序。usage: macs2 [-h] [--version] {callpeak,bdgpeakcall,bdgbroadca

qq_27390023的博客 3790

创建线程的四种方式

2.创建Callable实现类的实例,并使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值;3.调用其对象的start()方法,该方法表示启动一个线程,线程处于就绪状态,如果获取到cpu执行权,则会调用run()方法,执行对应的任务;3.将此对象作为形参传递到Thread类的构造器中,创建Thread类的对象,调用start()方法,启动线程;4.调用FutureTask对象的get()方法来获取子线程执行结束后的返回值;

qq_62726340的博客 3757

用Blender给ArduPilot无人船编队设计灯光秀:从建模到飞行的保姆级教程

本文详细介绍了如何利用Blender和ArduPilot为无人船编队设计灯光秀的全流程技术方案。从3D动画设计、坐标转换、数据导出到ArduPilot飞控配置和灯光控制,提供了一套完整的保姆级教程,帮助开发者实现水面灯光编队表演。

weixin_29213525的博客 386

【立创EDA-PCB设计基础】6.布线铺铜实战及细节详解

本文进行布线铺铜实战及详解布线铺铜的细节

嵌入式阿齐Archie 4万+

线程创建的四种方式

java中创建线程的四种方法以及区别 Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。Java可以用四种方式来创建线程,如下所示: 1)继承Thread类创建线程 2)实现Runnable接口创建线程 3)使用Callable和Future创建线程 4)使用线程池例如用Executor框架 下面让我们分别来看看这四种创建线程的方法。 ------------------------继承Thread类创建线程--------------------- .

weixin_44989630的博客 1万+

【模型之美】3、文本聚类与智能摘要,让AI帮你做个总结

在信息过载时代,文本聚类与摘要技术成为关键工具。本文提出了一种结合OpenAI Embedding与传统机器学习的方法,实现从文本预处理到智能分析的完整流程。技术方案分为三阶段:1)通过Embedding将文本转化为语义向量;2)采用K-Means等算法进行无监督聚类;3)利用大模型生成可解释的标签和摘要。实验证明,该方法能有效提升信息处理效率,如在新闻聚合系统中自动分类10,000篇文章,准确率较传统方法提高15%。方案包含实用代码示例,涵盖文本清洗、向量化、聚类优化等关键技术细节,可应用于对话记忆、舆情

2025博客之星Top81。专注AI工程化与架构实战。从分布式思维到模型部署,用工程化视角为你厘清AI落地的真实路径。 1440

线程创建方式和线程同步

一:创建线程方式:1.  继承Thread,然后重写run()方法例如: public class ThreadOne extends Thread {    @Override    public void run() {        Log.i("TAG","创建线程方式1");    }}启动线程方式start ThreadOne one = new ThreadOne();       ...

博客 1117

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

[Linux]进程与线程

本文,主要是集中讲述进程通信和线程同步的几种方式和模型,它们分别在那些使用场景和适用条件。 进程通信(APUE 15/17章):注意,这里是进程间通信是指:同一台计算机的进程 使用场景 管道 匿名管道(pipe族):只能在两个相关进程使用,并且这两个相关进程有一个共同的祖先进程。命名管道FIFO(mkfifo族):不相关的进程也能交换数据。 消息队列:

浪风一骑 371

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

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

java中的单例模式

单例模式的共性: 那就是这个类没有自己的状态,换句话说,这些类无论你实例化多少个,其实都是一样的,而且更重要的一点是,这个类如果有两个或者两个以上的实例的话,就会产生程序错误或者与现实相违背的逻辑错误。 单例模式的特点: 1,单例类只能有一个实例 2,单例类必须是自己创建自己的唯一实例 3,单例类必须给所有其他对象提供这一实例 单例模式的三种方式: 饿汉方式,线程安全

liagn的专栏 229

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

操作系统面试题集锦

1、多个线程组成一个进程,线程是CPU执行的基本单位,进程是由程序、数据和pcb组成2、对临界资源采取互斥访问方式实现共享3、*短作业优先算法,T1<T2<T3的平均周转时间:T1+2*T2/3+T3/3;4、死锁是多个进程在运行过程中因争夺资源,而造成的;产生死锁的根本原因是资源分配不恰当;产生死锁的必要条件:互斥条件、请求和保持条件、不剥夺和环路等待条件,其中银行家算法用于避免死锁...

qq_39322743的博客 403

线程同步方法

概述 线程同步可以采用多种方式。可以在用户方式下实现,也可以在内核方式下实现。前者的优势在于速度快,因为不用在用户方式和内核方式之间切换,但只能用于同一个进程内的线程之间的同步;后者是使用内核对象的方式,速度虽慢,但可以用于不同进程之间的线程同步。而且后者相对前者方法丰富许多,功能也强大许多。 用户方式下的线程同步 互锁函数组       下列函数可以以原子的方式进行操作(即或者全做,或者

踏雪无痕 896

请求的操作无法在使用用户映射区域打开的文件上执行_第3章 第1节 操作系统(一)...

● 请你说一下进程与线程的概念,以及为什么要有进程线程,其中有什么区别,他们各自又是怎么同步的参考回答:基本概念:进程是对运行时程序的封装,是系统进行资源调度和分配的的基本单位,实现了操作系统的并发;线程是进程的子任务,是CPU调度和分派的基本单位,用于保证程序的实时性,实现进程内部的并发;线程是操作系统可识别的最小执行和调度单位。每个线程都独自占用一个虚拟处理器:独自的寄存器组,...

weixin_39812224的博客 1794

Android多媒体-MediaPlayer使用方式

先不多说,直接上代码 public class SimpleMediaPlayerActivity extends Activity { //private static final Uri mMusicUri = Uri.fromFile(new File("/sdcard/sound_file_1.mp3")); private static final Uri mMusicUri

duanyu218的专栏 1069

网络编程Day04

线程管理 一、基础概念 1、线程是进程的执行线路,它是进程内部的控制序列,或者说线程是它所在进程的一部分(进程是一个资源单位,线程是进程的一部分,是真正负责执行的) 2、线程是轻量级的,没有它自己独立的代码段、数据段、bss段、堆、环境变量、命令行参数、文件描述符、信号处理函数、当前目录等资源 3、线程有自己独立的栈内存、线程ID、错误码、信号掩码等 4、一个进程可以包含多个线程(多个执行线路),但是至少有一个,这个线程是主线程 5、ps -T -p [p...

weixin_53854228的博客 243

WINDOWS下线程同步探讨

概述 线程同步可以采用多种方式。可以在用户方式下实现,也可以在内核方式下实现。前者的优势在于速度快,因为不用在用户方式和内核方式之间切换,但只能用于同一个进程内的线程之间的同步;后者是使用内核对象的方式,速度虽慢,但可以用于不同进程之间的线程同步。而且后者相对前者方法丰富许多,功能也强大许多。 用户方式下的线程同步 [b]互锁函数组[/b] 下列函数可以以原子的方式进行操作(即...

清风名 111

Java线程​:基本概念、可见性与同步

开发高性能并发应用不是一件容易的事情。这类应用的例子包括高性能Web服务器、游戏服务器和搜索引擎爬虫等。这样的应用可能需要同时处理成千上万个请求。对于这样的应用,一般采用多线程或事件驱动的架构。对于Java来说,在语言内部提供了线程的支持。但是Java的多线程应用开发会遇到很多问题。首先是很难编写正确,其次是很难测试是否正确,最后是出现问题时很难调试。一个多线程应用可能运行了好几天都没问题,然后突然

hugh 的博客 279

操作系统高响应比优先调度算法代码_操作系统面试题汇总(找工作必备)

在这里整理了一套操作系统常见的面试题,不管你是面试大厂还是小厂都足够了。问题一、操作系统的基本特征1、并发并发指一段时间内能同时运行多个程序,并行指同一时刻能运行多个指令。操作系统通过引入进程和线程,使得程序能够并发运行。2、共享共享是指系统中的资源可以被多个并发进程共同使用。它主要有两种共享方式:互斥共享和同时共享。多个应用并发执行的时候,宏观上要体现出它们在同时访问资源的情况,而微观...

weixin_39881575的博客 1500

数据库(三)MySQL主从复制原理及实现

在企业级应用开发中,随着业务规模的不断扩大,数据量和访问量也随之增长。单台MySQL服务器往往难以满足高安全性、高可用性以及高并发访问的实际需求。为了应对这些挑战,采用MySQL主从复制(Replication)与读写分离(Read/Write Splitting)架构成为一种常见的解决方案。主从复制实现了数据的实时备份和读写操作的分离,从而提升了数据库的整体性能和可靠性。本文将深入探讨MySQL主从复制的原理、工作过程、同步方式,并通过实验演示如何搭建主从复制与读写分离环境。读写分离。

qq_55656748的博客 1023
上一篇: 静态区 常量池
下一篇: 异常类
CRUD_coder
博客等级 码龄6年 106粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值