Thread(下) 【016】

-------[size=medium][color=red]TestDeadLock[/color][/size]------------------------------------------------------------------------
[code]
package com.testthread2;

public class TestDeadLock implements Runnable {
public int flag ;
static Object o1 = new Object() ;
static Object o2 = new Object() ;
public void run() {
System.out.println("flag" + flag) ;
if(flag == 1) {
synchronized(o1) {
try {
Thread.sleep(500) ;
} catch (Exception e) {
e.printStackTrace() ;
}
synchronized(o2) {
System.out.println("1") ;
}
}
}
if(flag == 0) {
synchronized(o2) {
try {
Thread.sleep(500) ;
} catch(Exception e) {
e.printStackTrace();
}
synchronized(o1) {
System.out.println("0") ;
}
}
}
}

public static void main(String args[]) {
TestDeadLock td1 = new TestDeadLock() ;
TestDeadLock td2 = new TestDeadLock() ;
td1.flag = 1 ;
td2.flag = 0 ;
Thread t1 = new Thread(td1) ;
Thread t2 = new Thread(td2) ;
t1.start();
t2.start();
}

}

[/code]

-------[size=medium][color=red]TestSynchronized[/color][/size]------------------------------------------------------------------------
[code]
package com.testthread2;

// 两个进程同时调用同一个方法
public class TestSync implements Runnable{
Timer timer = new Timer() ;
public static void main(String args[]) {
TestSync test = new TestSync() ;
Thread t1 = new Thread(test) ;
Thread t2 = new Thread(test) ;
t1.setName("t1") ;
t2.setName("t2") ;
t1.start();
t2.start();
}
public void run() {
timer.add(Thread.currentThread().getName()) ;
}
}

class Timer {
private static int num = 0;

public synchronized void add(String name) { //用synchronized锁定当前对象
num++;
try {
Thread.sleep(1);
} catch (InterruptedException e) {

}
System.out.println(name + ",,你是第" + num + "个使用timer的线程");

}
}

[/code]

-------[size=medium][color=red]Synchronized or NoSynchronized[/color][/size]------------------------------------------------------------------------

[code]
package com.testthread2;

public class TT implements Runnable {
int b= 100 ;

public synchronized void m1() throws Exception {
b = 1000 ;
Thread.sleep(5000) ;
System.out.println("b="+b) ;
}

public synchronized void m2() throws Exception {
// public void m2() throws Exception {
Thread.sleep(2500) ;
b = 2000 ;
}

public void run() {
try {
m1() ;
} catch (Exception e) {
e.printStackTrace() ;
}
}

public static void main(String args[]) throws Exception {
TT tt = new TT() ;
Thread t = new Thread(tt) ;
t.start();

tt.m2();
System.out.println(tt.b) ;
}

}
[/code]

-------[size=medium][color=red]Producer & Consumer [/color][/size]------------------------------------------------------------------------
[code]
package com.testthread2;

public class ProducerConsumer {
public static void main(String args[]) {
SyncStack ss = new SyncStack() ;
Producer p = new Producer(ss) ;
Consumer c = new Consumer(ss) ;
new Thread(p).start() ;
new Thread(c).start() ;
}

}

class WoTou {
int id ;
WoTou(int id) {
this.id = id ;
}
public String toString() {
return "WoTou :" + id ;
}
}

class SyncStack {
int index = 0 ; //装到第几个了
WoTou[] arrWT = new WoTou[6] ;

public synchronized void push(WoTou wt) { //往筐里放馒头
while(index == arrWT.length) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
} //当前对象 wait:当前的正在访问该对象的线程wait
}
this.notify();
arrWT[index] = wt ;
index ++ ;
}

public synchronized WoTou pop() { //从筐里取出馒头
while(index == 0) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notify() ;
index -- ;
return arrWT[index] ;
}
}

class Producer implements Runnable {
SyncStack ss = null ;
public Producer(SyncStack ss) {
this.ss =ss ;
}

public void run() {
for(int i=0; i<25; i++) { //生产的馒头
WoTou wt = new WoTou(i) ;
ss.push(wt) ;
System.out.println("生产了:" + wt) ;
// try {
// Thread.sleep(1000) ;
// } catch (InterruptedException e) {
// e.printStackTrace() ;
// }
}
}
}

class Consumer implements Runnable {
SyncStack ss = null ;
public Consumer(SyncStack ss) {
this.ss =ss ;
}

public void run() {
for(int i=0; i<20; i++) { //消费的馒头
WoTou wt = ss.pop();
System.out.println("消费了:" +wt) ;
// try {
// Thread.sleep(1000) ;
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
}
}
}
[/code]
US-016模拟超声波测距模块原理与嵌入式集成 超声波测距是嵌入式系统中实现非接触式距离感知的基础技术,其核心基于飞行时间(ToF)原理,通过声波在空气中的传播与反射时间换算物理距离。模拟量输出型传感器如US-016,将ToF结果直接转换为线性电压信号,规避了数字接口所需的时序解析与协议栈开销,显著降低MCU软件复杂度和硬件设计门槛。该类器件在液位监测、工业限位、简易避障等对实时性要求适中但强调鲁棒性与低功耗的场景中具备突出工程价值。结合ADC采样、量程切换(RANGE引脚)、温度补偿与噪声抑制等关键技术环节,可构建高稳定性测距系统。本文以US-016为 阅读详情

相关推荐

RT-Thread Studio实战:74HC595级联控制继电器阵列的优化策略

本文详细介绍了在RT-Thread Studio环境下优化74HC595级联控制继电器阵列的实战策略。针对信号完整性、代码结构和实时性等核心挑战,提供了硬件电路优化和软件架构改进方案,包括状态管理重构、实时性保障及动态功耗控制等技巧,有效提升系统稳定性和响应速度。

weixin_29161785的博客 355

[016] [RT-Thread学习笔记] 链表源码分析

rt-thread中的链表源码在`rtservice.h`中,以宏或者内联函数的形式给出,其中,`list`为双向链表,`slist`为单向链表。rt-thread链表主要是为了连接管理内核对象,因此并无数据域,仅有指针域。 # 1 单向链表 ## 1.1 单向链表节点结构体 `Single List structure`定义在`rtdef.h`中: ```c struct rt_slist_node { struct rt_slist_node *next; }; typedef struc

柯西的彷徨的博客 1138

LoFTR训练避坑指南:从零到一复现论文训练流程

本文是一份详细的LoFTR模型训练避坑指南,旨在帮助开发者从零开始复现论文训练流程。文章系统性地讲解了环境配置、数据准备、代码调试与显存优化等关键步骤,并针对常见的训练错误提供了解决方案,确保训练过程顺利进行。

weixin_29091837的博客 204

RT-Thread 学习笔记(七)---开启基于SPI Flash的elmfat文件系统(中)

软件环境:Win7,Keil MDK 4.72a, IAR EWARM 7.2, GCC 4.2,Python 2.7 ,SCons 2.3.2 硬件环境:Baiwei STM32F103ZE-EK v3.0开发板 参考文章:RT-Thread编程指南 [RTthread]新版本RTT中的SPI驱动框架 Github托管的Realtouch分支中examples目录

aping_cs_dn的专栏 9461

高精度之Hanoi双塔问题

Description给定A、B、C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的。现要将这些圆盘移到C柱上,在移动过程中可放在B柱上暂存。要求:(1)每次只能移动一个圆盘; (2)A、B、C三根细柱上的圆盘都要保持上小下大的顺序; 任务:设An为2n个圆盘完成上述任务所需的最少移动次数,对于输入的n,输出An。 Inp

wood 1990

Jenkins+docker 微服务实现自动化部署安装和部署过程

本文详细介绍了如何使用Docker部署Jenkins自动化服务器。主要内容包括:1)拉取Jenkins官方或BlueOcean镜像;2)创建容器并配置端口映射、数据卷挂载;3)设置防火墙规则;4)配置清华大学镜像加速;5)安装必要插件;6)SSH密钥配置;7)构建触发器设置;8)编写自动化构建脚本。通过Docker部署Jenkins可以简化安装流程,确保环境一致性,并利用容器特性实现快速启动和管理。文章提供了完整的配置步骤和注意事项,帮助用户快速搭建CI/CD环境。

qq_33665793的博客 1694

Thread

有用的(转载) 一个普通的Java类只要从Thread类继承,就可以成为一个线程类。并可通过Thread类的start方法来执行线程代码。虽然Thread类的子类可以直接实例化,但在子类中必须要覆盖Thread类的run方法才能真正运行线程的代码。下面的代码给出了一个使用Thread类建立线程的例子:   001  package mythread;   002    003  public cl...

iteye_11的博客 564

comfyui利用 SkyReels-V2直接生成长视频本地部署问题总结 2 :寻找丢失的model 和工作流中 get set 方法的应用

寻找丢失的model 和工作流中 get set 方法的应用,为什么有写工作流 中有很多断掉的节点,没有相互链接?

AI懒虫 1793

day016

什么是进程?什么是程序?有什么区别? 程序:数据与指令的集合,程序是静态的 进程:给程序加入了时间的概念,不同的时间进程有不同的状态 进程是动态的,就代表OS中正在运行的程序 独立性,动态性,并发性 什么是并行?什么是并发? CPU:电脑的核心处理器,类似于“大脑” 并行:相对来说资源比较充足,多个CPU可以同时处理不同的进程 并发:相对来说资源比较紧缺,多个进程同时抢占公共资源,比如CPU 什么是线程?线程与进程有什么关系? 线程是OS能够进行运算调度的最小单位 一个进程可以拥有多个线程,当然.

qq_41916663的博客 280

我爬取了某非法网贷后台系统数据,终于知道什么叫做利滚利滚利滚利了

我爬取了非法贷款的后台网站!

weixin_44042821的博客 2882

利用Python脚本在ADS2024 Update2中动态绘制与验证LPDDR5眼图模板

本文详细介绍了如何在ADS2024 Update2中,利用Python脚本动态绘制与验证LPDDR5眼图模板。通过调用DDS Python接口,工程师可在仿真后无需重新运行,即可灵活添加、修改矩形或六边形眼图模板,并实现批量自动化处理,从而极大提升高速信号(如LPDDR5)的调试与验证效率。

raspberrypi5的博客 603

A016_线程及线程安全

线程及线程安全

窗外有风景,笔下有前途,低头是题海,抬头是未来 538

python基础语法与数据结构

本文摘要: Python基础语法包含输入输出、函数、变量、数据类型及运算符等内容。输入函数input()获取键盘输入并以字符串存储,输出函数print()可格式化输出数据。函数通过def定义,可带参数和返回值,提高代码复用性。变量无需声明类型,可动态赋值。数据类型包括数字、字符串、布尔及复合类型,可通过type()查看。运算符包含算术、赋值等类型,其中复合赋值运算符如+=可简化运算。类型转换函数如int()、str()等可实现显式类型转换。这些基础语法构成Python编程的核心要素。

MM602388的博客 436

java多线程,用Thread类创建线程,详细讲解

在Java中创建线程有两种方法:使用Thread类和使用Runnable接口。在使用Runnable接口时需要建立一个Thread实例。因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例。Thread类的构造方法被重载了八次构造方法如下: Runnable target实现了Runnable接口的类的实例。要注意的是Thread类也实现了Runnable接口,因此,从Thread类继承的类的实例也可以作为target传入这个构造方法。 Str.

weixin_58610844的博客 560

使用buildroot系统的qmake编译QT出现Unknown module(s) in QT: xxxx 的错误解决方法

可以看到,我这里使用的是 qt5base-5.15.2 目录下的qmake,这个qmake只包含了基础的qt模块,而额外添加的qt模块没有包含进去,需要使用。可以看到我这里是有的,如果你跟我一样,模块存在,但是还是报找不到对应模块的错误的话,大概率是跟我一样,用错qmake了,看第二点。在包含 qt5base 目录下查看,是否有对应模块的目录,如果没有的话,需要通过make menuconfig 添加一下。目录下的qmake才可以。

T541132的博客 2490

android 蓝牙通讯demo

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

rt-thread使用Alarm组件的一点问题

但是因为硬件RTC中断后给alarm线程发送event,然后alarm线程接收到event,再获取rtc实时时间和闹钟设置的时间进行比较,这个过程属于异步操作,线程唤醒和切换需要花费一些时间,这就有可能在alarm_update函数中获取到的实时时间比闹钟中断产生时的时间要滞后,我这里的情况就是如此,每次获取到的实时时间总是比闹钟设置时间的秒大1,导致上面if判断语句为0,从而闹钟时间得不到更新,和闹钟没有被唤醒,闹钟回调函数没有被调用。

u011914605的博客 792

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【day016】Java学习,坚持就是胜利!

一、Thread类的常用方法 二、创建多线程程序的第二种方式 三、Thread和Runnable的区别 四、 五、 六、 七、 八、 九、 十、 十一、 十二、 十三、 十四、 十五、 十六、 十七、 十八、 十九、 二十、 二十一、 二十二、 二十三、 二十四、 二十五、 二十六、 二十七、 二十八、 二十九、 三十 ...

qq_38592706的博客 134

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

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

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

RT-Thread如何打印uint64_t

在使用RT-Thread的过程中,发现RT-Thread用打印uint32_t的方法打印uint64_t会打印出异常值,花了比较长时间才找到正确的打印方法。 本文主要总结了RT-Thread打印uint64_t的代码。

childerxxx的博客 1941

用Thread类创建线程(八个构造方法,线程名的指定、线程不能重复调用)

内容提要: 八个构造方法 线程名的指定:构造方法、setName 线程不能重复调用,否则抛异常(IllegalThreadStateException异常) 在Java中创建线程有两种方法:使用Thread类和使用Runnable接口。在使用Runnable接口时需要建立一个Thread实例。因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread...

bohaiwaiwai的博客 577

Java多线程初学者指南(2):用Thread类创建线程

在Java中创建线程有两种方法:使用Thread类和使用Runnable接口。在使用Runnable接口时需要建立一个Thread实例。因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例。Thread类的构造方法被重载了八次,构造方法如下: public Thread( ); public Thread(Runnable target); public Thread(String name); public Thread(Runnable

luoshenFU的专栏 572

Java多线程(2):用Thread类创建线程

在Java中创建线程有两种方法:使用Thread类和使用Runnable接口。在使用Runnable接口时需要建立一个Thread实例。因此,无论是通过 Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例。Thread类的构造方法被重载了八次,构造方法如下: public Thread( ); public Thread(Runnable target...

LRC的专栏 139

Rust 编程视频教程(进阶)——016_2 创建线程与等待线程结束

视频地址 头条地址:https://www.ixigua.com/i6775861706447913485 B站地址:https://www.bilibili.com/video/av81202308/ 源码地址 github地址:https://github.com/anonymousGiga/learn_rust 讲解内容 1、创建线程 (1)方法:调用thread::spawn即可 (2)例...

令狐一冲 437

rt-thread learning notes

rt-thread learning notes 2018-01-15   > 001  具有相同优先级的线程,每个线程的时间片大小都可以在初始化或创建该线程时指定 1 rt_thread_t rt_thread_create(const char *name, 2 void (*entry)(void *param...

weixin_30394633的博客 115

Java自学习day18-多线程的创建方式一:继承于Thread类

多线程的创建,方式一:继承于Thread类 * 1. 创建一个继承于Thread类的子类 * 2. 重写Thread类的run() --> 将此线程执行的操作声明在run()中 * 3. 创建Thread类的子类的对象 * 4. 通过此对象调用start() 例子:遍历100以内的所有的偶数 验证问题一:我们不能通过直接调用run()的方式启动线程。 run(); package atguigu.java; //1. 创建一个继承于Thread类的子类 class MyThread e

加油鸭 414

016 内核对象的Signal状态3

Signal   ● Signal = FALSE 相当于标志   ● 进程 初始化FALSE 运行完成 设置位 TURE   ● 线程   ● 标准输入输出流   ● 互斥体   ● 信号   ● 可等待计时器   ● 作业   ● WaitForSingleObject() 句柄,时间     ○ 当前正在执行的线程,变成不可调度的状态,     ○ 等待Signal 状态...

afqz46812的博客 225

Java 线程 sleep wait 深入解析 Thread

wait 和 sleep 区别 sleep 是 Thread 的方法,wait 是 Object 的方法 sleep 不会释放锁,wait 会释放锁 sleep 是休眠,wait 是挂起 wait 唤醒需要用 notify 或者 notifyAll 而 sleep 则是休眠一段时间自己就恢复 wait方法需要在synchronize块或者synchronize方法里调用,然而 sleep 不需要 如

手把手教你学安卓 1324
上一篇: Thread(上) 【015】
下一篇: 摘录&——[updating…]
java_cto
博客等级 码龄18年 5粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值