太逗了,面试官让我讲线程 WAITING 状态!

【java】死锁产生分析与检测分析工具 最近在看了一些关于多线程死锁分析的博客,在死锁的分析方面有了一点自己的经验,下面将它总结记录下来。 1. 死锁简介 1.1 死锁的产生 1.2 线程 1.3 锁 2. 死锁举例 3. 死锁分析 3.1 VisualVM简介 3.2 VisualVM中插件安装 3.3 线程监视 3.4线程dump分析 3.5 Dump内容分析 3.6 利用Thread Dumps Anal... 阅读详情

点击上方“芋道源码”,选择“设为星标”

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 8:55 更新文章,每天掉亿点点头发...

源码精品专栏

 

来源:my.oschina.net/goldenshaw/blog/802620

  • 线程间的协作(cooperate)机制

  • wait 的场景

    • 竞争关系

    • 条件

    • 等待是必要的吗?

    • 协作关系

    • 生产者与消费者问题

    • 代码的演示:

  • join场景及其它

  • 与传统 waiting 状态的关系


面试官Q:你讲下线程状态中的WAITING状态,什么时候会处于这个状态?什么时候离开这个状态?

小菜J 会心一笑...

一个正在无限期等待另一个线程执行一个特别的动作的线程处于WAITING状态。

“

A thread that is waiting indefinitely for another thread to perform a particular action is in this state.

然而这里并没有详细说明这个“特别的动作”到底是什么,详细定义还是看 javadoc(jdk8):

一个线程进入 WAITING 状态是因为调用了以下方法:

  • 不带时限的 Object.wait 方法

  • 不带时限的 Thread.join 方法

  • LockSupport.park

然后会等其它线程执行一个特别的动作,比如:

  • 一个调用了某个对象的 Object.wait 方法的线程会等待另一个线程调用此对象的 Object.notify() 或 Object.notifyAll()。

  • 一个调用了 Thread.join 方法的线程会等待指定的线程结束。

对应的英文原文如下:

“

A thread is in the waiting state due to calling one of the following methods:

  • Object.wait with no timeout

  • Thread.join with no timeout

  • LockSupport.park

A thread in the waiting state is waiting for another thread to perform a particular action. For example, a thread that has called Object.wait() on an object is waiting for another thread to call Object.notify() or Object.notifyAll() on that object. A thread that has called Thread.join() is waiting for a specified thread to terminate.

线程间的协作(cooperate)机制

显然,WAITING 状态所涉及的不是一个线程的独角戏,相反,它涉及多个线程,具体地讲,这是多个线程间的一种协作机制。谈到线程我们经常想到的是线程间的竞争(race),比如去争夺锁,但这并不是故事的全部,线程间也会有协作机制。

“

就好比在公司里你和你的同事们,你们可能存在在晋升时的竞争,但更多时候你们更多是一起合作以完成某些任务。

wait/notify 就是线程间的一种协作机制,那么首先,为什么 wait?什么时候 wait?它为什么要等其它线程执行“特别的动作”?它到底解决了什么问题?

wait 的场景

首先,为什么要 wait 呢?简单讲,是因为**条件(condition)**不满足。那么什么是条件呢?为方便理解,我们设想一个场景:

有一节列车车厢,有很多乘客,每个乘客相当于一个线程;里面有个厕所,这是一个公共资源,且一次只允许一个线程进去访问(毕竟没人希望在上厕所期间还与他人共享~)。

竞争关系

假如有多个乘客想同时上厕所,那么这里首先存在的是竞争的关系。

如果将厕所视为一个对象,它有一把锁,想上厕所的乘客线程需要先获取到锁,然后才能进入厕所。

Java 在语言级直接提供了同步的机制,也即是 synchronized 关键字:

“

synchronized(expression) {……}

它的机制是这样的:对表达式(expresssion)求值(值的类型须是引用类型(reference type)),获取它所代表的对象,然后尝试获取这个对象的锁:

  • 如果能获取锁,则进入同步块执行,执行完后退出同步块,并归还对象的锁(异常退出也会归还);

  • 如果不能获取锁,则阻塞在这里,直到能够获取锁。

在一个线程还在厕所期间,其它同时想上厕所的线程被阻塞,处在该厕所对象的 entry set 中,处于 BLOCKED 状态。

完事之后,退出厕所,归还锁。

之后,系统再在 entry set 中挑选一个线程,将锁给到它。

对于以上过程,以下为一个 gif 动图演示:

当然,这就是我们所熟悉的锁的竞争过程。以下为演示的代码:

@Test
public void testBlockedState() throws Exception {
 class Toilet { // 厕所类
  public void pee() { // 尿尿方法
   try {
    Thread.sleep(21000);// 研究表明,动物无论大小尿尿时间都在21秒左右
   } catch (InterruptedException e) {
    Thread.currentThread().interrupt();
   }
  }
 }

 Toilet toilet = new Toilet();

 Thread passenger1 = new Thread(new Runnable() {
  public void run() {
   synchronized (toilet) {
    toilet.pee();
   }
  }
 });

 Thread passenger2 = new Thread(new Runnable() {
  public void run() {
   synchronized (toilet) {
    toilet.pee();
   }
  }
 });

 passenger1.start();

 // 确保乘客1先启动
 Thread.sleep(100);

 passenger2.start();

 // 确保已经执行了 run 方法
 Thread.sleep(100);

 // 在乘客1在厕所期间,乘客2处于 BLOCKED 状态
 assertThat(passenger2.getState()).isEqualTo(Thread.State.BLOCKED);
}

条件

现在,假设有个女乘客,她抢到了锁,进去之后裤子脱了一半,发现马桶的垫圈纸没了,于是拒绝尿。

“

或许是因为她比较讲究卫生,怕直接坐上去会弄脏她白花花的屁股~

现在,条件出现了:有纸没纸,这就是某种条件。

那么,现在条件不满足,这位女线程改怎么办呢?如果只是在里面干等,显然是不行的。

“

这不就是人民群众所深恶痛绝的“占着茅坑不拉尿”吗?

  • 一方面,外面 entry set 中可能好多群众还嗷嗷待尿呢(其中可能有很多大老爷线程,他们才不在乎有没有马桶垫圈纸~)

  • 另一方面,假定外面同时有“乘务员线程”,准备进去增加垫圈纸,可你在里面霸占着不出来,别人也没法进去,也就没法加纸。

所以,当条件不满足时,需要出来,要把锁还回去,以使得诸如“乘务员线程”的能进去增加纸张。

等待是必要的吗?

那么出来之后是否一定需要等待呢?当然也未必。

“

这里所谓“等待”,指的是使线程处于不再活动的状态,即是从调度队列中剔除。

如果不等待,只是简单归还锁,用一个反复的循环来判断条件是否满足,那么还是可以再次回到调度队列,然后期待在下一次被调度到的时候,可能条件已经发生变化:

“

比如某个“乘务员线程”已经在之前被调度并增加了里面的垫圈纸。自然,也可能再次调度到的时候,条件依旧是不满足的。

现在让我们考虑一种比较极端的情况:厕所外一大堆的“女乘客线程”想进去方便,同时还有一个焦急的“乘务员线程”想进去增加厕纸。

如果线程都不等待,而厕所又是一个公共资源,无法并发访问。调度器每次挑一个线程进去,挑中“乘务员线程”的几率反而降低了,entry set 中很可能越聚越多无法完成方便的“女乘客线程”,“乘务员线程”被选中执行的几率越发下降。

“

当然,同步机制会防止产生所谓的“饥饿(starvation)”现象,“乘务员线程”最终还是有机会执行的,只是系统运行的效率下降了。

所以,这会干扰正常工作的线程,挤占了资源,反而影响了自身条件的满足。另外,“乘务员线程”可能这段时间根本没有启动,此时,不愿等待的“女乘客线程”不过是徒劳地进进出出,占用了 CPU 资源却没有办成正事。

“

效果上还是在这种没有进展的进进出出中等待,这种情形类似于所谓的忙等待 (busy waiting)。

协作关系

综上,等待还是有必要的,我们需要一种更高效的机制,也即是 wait/notify 的协作机制。

当条件不满足时,应该调用 wait()方法,这时线程释放锁,并进入所谓的 wait set 中,具体的讲,是进入这个厕所对象的 wait set 中:

这时,线程不再活动,不再参与调度,因此不会浪费 CPU 资源,也不会去竞争锁了,这时的线程状态即是 WAITING。

“

现在的问题是:她们什么时候才能再次活动呢?显然,最佳的时机是当条件满足的时候。

之后,“乘务员线程”进去增加厕纸,当然,此时,它也不能只是简单加完厕纸就完了,它还要执行一个特别的动作,也即是“通知(notify)”在这个对象上等待的女乘客线程:

“

大概就是向她们喊一声:“有纸啦!赶紧去尿吧!”显然,如果只是“女乘客线程”方面一厢情愿地等待,她们将没有机会再执行。

所谓“通知”,也即是把她们从 wait set 中释放出来,重新进入到调度队列(ready queue)中。

  • 如果是 notify,则选取所通知对象的 wait set 中的一个线程释放;

  • 如果是 notifyAll,则释放所通知对象的 wait set 上的全部线程。

整个过程如下图所示:

对于上述过程,我们也给出以下 gif 动图演示:

注意:哪怕只通知了一个等待的线程,被通知线程也不能立即恢复执行,因为她当初中断的地方是在同步块内,而此刻她已经不持有锁,所以她需要再次尝试去获取锁(很可能面临其它线程的竞争),成功后才能在当初调用 wait 方法之后的地方恢复执行。(这也即是所谓的 “reenter after calling Object.wait”)

  • 如果能获取锁,线程就从 WAITING 状态变成 RUNNABLE 状态;

  • 否则,从 wait set 出来,又进入 entry set,线程就从 WAITING 状态又变成 BLOCKED 状态。

综上,这是一个协作机制,“女乘客线程”和“乘务员线程”间存在一个协作关系。显然,这种协作关系的存在,“女乘客线程”可以避免在条件不满足时的盲目尝试,也为“乘务员线程”的顺利执行腾出了资源;同时,在条件满足时,又能及时得到通知。协作关系的存在使得彼此都能受益。

生产者与消费者问题

不难发现,以上实质上也就是经典的“生产者与消费者”的问题:

“

乘务员线程生产厕纸,女乘客线程消费厕纸。当厕纸没有时(条件不满足),女乘客线程等待,乘务员线程添加厕纸(使条件满足),并通知女乘客线程(解除她们的等待状态)。接下来,女乘客线程能否进一步执行则取决于锁的获取情况。

代码的演示:

在以下代码中,演示了上述的 wait/notify 的过程:

@Test
public void testWaitingState() throws Exception {

 class Toilet { // 厕所类
  int paperCount = 0; // 纸张

  public void pee() { // 尿尿方法
   try {
    Thread.sleep(21000);// 研究表明,动物无论大小尿尿时间都在21秒左右
   } catch (InterruptedException e) {
    Thread.currentThread().interrupt();
   }
  }
 }

 Toilet toilet = new Toilet();

 // 两乘客线程
 Thread[] passengers = new Thread[2];
 for (int i = 0; i < passengers.length; i++) {
  passengers[i] = new Thread(new Runnable() {
   public void run() {
    synchronized (toilet) {
     while (toilet.paperCount < 1) {
      try {
       toilet.wait(); // 条件不满足,等待
      } catch (InterruptedException e) {
       Thread.currentThread().interrupt();
      }
     }
     toilet.paperCount--; // 使用一张纸
     toilet.pee();
    }
   }
  });
 }

 // 乘务员线程
 Thread steward = new Thread(new Runnable() {
  public void run() {
   synchronized (toilet) {
    toilet.paperCount += 10;// 增加十张纸
    toilet.notifyAll();// 通知所有在此对象上等待的线程
   }
  }
 });

 passengers[0].start();
 passengers[1].start();

 // 确保已经执行了 run 方法
 Thread.sleep(100);

 // 没有纸,两线程均进入等待状态
 assertThat(passengers[0].getState()).isEqualTo(Thread.State.WAITING);
 assertThat(passengers[1].getState()).isEqualTo(Thread.State.WAITING);

 // 乘务员线程启动,救星来了
 steward.start();

 // 确保已经增加纸张并已通知
 Thread.sleep(100);

 // 其中之一会得到锁,并执行 pee,但无法确定是哪个,所以用 "或 ||"
 // 注:因为 pee 方法中实际调用是 sleep, 所以很快就从 RUNNABLE 转入 TIMED_WAITING(sleep 时对应的状态)
 assertTrue(Thread.State.TIMED_WAITING.equals(passengers[0].getState())
   || Thread.State.TIMED_WAITING.equals(passengers[1].getState()));

 // 其中之一则被阻塞,但无法确定是哪个,所以用 "或 ||"
 assertTrue(
   Thread.State.BLOCKED.equals(passengers[0].getState()) || Thread.State.BLOCKED.equals(passengers[1].getState()));
}

join场景及其它

从定义中可知,除了 wait/notify 外,调用 join 方法也会让线程处于 WAITING 状态。

join 的机制中并没有显式的 wait/notify 的调用,但可以视作是一种特殊的,隐式的 wait/notify 机制。

假如有 a,b 两个线程,在 a 线程中执行 b.join(),相当于让 a 去等待 b,此时 a 停止执行,等 b 执行完了,系统内部会隐式地通知 a,使 a 解除等待状态,恢复执行。

“

换言之,a 等待的条件是 “b 执行完毕”,b 完成后,系统会自动通知 a。

关于 LockSupport.park 的情况则由读者自行分析。

与传统 waiting 状态的关系

Thread.State.WAITING 状态与传统的 waiting 状态类似:



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

已在知识星球更新源码解析如下:

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 20 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

兄弟,艿一口,点个赞!????

零基础搭建机械零件检测系统:基于YOLOv8的PySide6可视化开发全攻略 本文详细介绍了如何从零开始搭建基于YOLOv8的机械零件检测系统,涵盖环境配置、数据集准备、模型训练优化及PySide6可视化界面开发全流程。通过实战案例展示YOLOv8在工业检测中的高效应用,帮助开发者快速实现自动化零件检测解决方案。 阅读详情

相关推荐

西门子V90 PN伺服控制核心:FB284功能块详解与实战

在工业自动化中,伺服定位控制是运动控制的基础环节,其本质是PLC通过PROFINET协议与伺服驱动器实现高速、确定性数据交互。FB284作为西门子为V90 PN定制的标准化功能块,封装了GSD映射、状态机管理与周期性PDO同步机制,将底层寄存器操作抽象为高可靠调用接口。相比MOVE指令或MC_MoveAbsolute等通用方案,FB284显著降低时序错乱风险,提升多轴同步精度与故障响应能力。它广泛应用于包装、灌装、装配等中端产线,尤其适配S7-1200/1500平台下的快速部署与现场维护。本文聚焦V90 P

weixin_42696271的博客 300

线程异常WAITING(parking)

项目中线程数量持续增长,且基本无法回收关闭,线程数量一直累积达到几万,影响CPU开销和性能,导致服务器卡死

qq_38783304的博客 1万+

手把手教你用scATAC-seq分析拟南芥根尖染色质可及性(附代码实战)

本文详细介绍了使用scATAC-seq技术分析拟南芥根尖染色质可及性的完整流程,涵盖从实验设计、数据质控、细胞分群到差异分析和多组学整合的实战步骤。通过具体的代码示例,帮助植物研究者掌握单细胞表观组学分析的核心方法,揭示细胞异质性和基因调控动态。

weixin_29291185的博客 267

Java 线程状态之 WAITING

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34410662的博客 594

Backblaze 2025全年硬盘故障率报告解读

作为长期追踪存储行业动态的科技博主,每年/季度Backblaze的Drive Stats报告都是我重点关注的核心内容——不同于厂商发布的实验室数据,Backblaze以近13年、数十万片企业级硬盘的真实运行数据为基础,其年化故障率(AFR)、寿命趋势等结论,直接反映了硬盘在严苛数据中心环境下的真实表现,无论是企业存储选型还是个人高端存储参考,都具备极高的实用价值。2025年末,Backblaze发布了第13年的年度收官报告,涵盖2025年Q4、全年及终身硬盘可靠性数据。

存储随笔 4022

Innovus ECO修复时序违例:ecoAddRepeater插Buffer原理与实战

芯片物理设计越到后期,时序收敛越依赖局部修正而非全局重跑。ECO(Engineering Change Order)作为数字后端高频操作,能在不破坏既有布局布线结果的前提下,精准修复DRV违例、hold时序问题或实现功能补丁。其中,插入Buffer或Inverter是拆解长线RC负载、改善max_transition/max_capacitance最直接的手段。Innovus提供的ecoAddRepeater命令封装了单元选择、坐标摆放和网表重连等底层细节,配合ecoRoute可快速完成绕线。合理选型Buf

weixin_31858171的博客 301

java.lang.Thread.State:WAITING(parking)

闲话少说, Tomcat日志报错及堆栈信息: 因为这个问题,挂了几个节点。 跟踪报错的代码发现代码中用到future.get()方法: Callable<Object> myCallable = createThreadCallable(interfaceName, httpbody, authSeedVo); Future&...

weixin_30569001的博客 4852

2024“华为杯”中国研究生数学建模竞赛(A题)深度剖析_数学建模完整过程+详细思路+代码全解析

目标是优化风力涡轮机的功率调度,使其在给定的实时风速数据下,最小化涡轮机关键组件(如塔架和主轴)的疲劳损伤。问题的挑战在于,考虑通信延迟和测量噪声的同时,要确保功率输出与风速变化的响应快速且准确。

2401_82549447的博客 6633

jvm未命名线程一直waiting问题排查

保留阶段告知系统从某一地址开始到后面的dwSize大小的连续虚拟内存需要供程序使用,进程其他分配内存的操作不得使用这段内存;应用中创建了多个client , 但是每个client 都会维护一个检测连接相关东西的task , 并且是直接使用executors new出来的未命名线程 , 最终重写class 定义了一个全局唯一的线程池解决。ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]' 查看僵尸进程 -> 无。但不是原因 , 发布后 waiting线程数依旧很多。

qq_37230349的博客 1256

从频谱分析到硬件加速:用ZYNQ-7020+FFT IP核实现实时信号处理的完整方案

本文详细介绍了如何利用ZYNQ-7020和FFT IP核实现实时信号处理的完整方案,涵盖系统架构设计、硬件加速实现及性能优化。通过异构计算架构,该方案将1024点FFT处理延迟压缩至28μs,显著提升工业自动化和无线通信等领域的实时频谱分析效率。

weixin_33704234的博客 470

告别第三方控件!C#实现OPC UA客户端,对接工业设备超简单

C#实现OPC UA客户端无需依赖第三方商业控件,通过快速起步:通过NuGet安装,使用模拟器完成前期开发测试;复用性强:封装通用工具类,支持连接、读写、订阅等核心功能,可直接集成到各类上位机项目;界面友好:通过WinForm绑定工具类,实现可视化操作,适配工业现场人员使用;工业适配:支持安全配置、身份验证,联调步骤清晰,可快速对接西门子、欧姆龙等主流工业设备;稳定性高:具备资源释放、异常处理、线程安全UI更新等特性,满足工业7×24小时运行要求。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1371

【面试官】线程有几种状态,状态之间的流转是怎样的?

NEW:线程尚未启动。RUNNABLE:线程正在等待 CPU 调度执行,可能正在运行,也可能等待 CPU 资源。BLOCKED:线程正在等待获取锁。WAITING:线程正在等待其他线程的通知(没有超时)。:线程正在等待某个条件满足,并且设置了超时。TERMINATED:线程已经执行完毕并结束。

Venus's Blog 4773

华为OD新系统机试真题 2026.5.10 - 美观的灯笼

华为OD新系统机试真题【美观的灯笼】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【美观的灯笼】

qq_45776114的博客 644

面试官让我讲下线程的WAITING状态,我笑了

点击上方“小哈学Java”,选择“星标”回复“666”,领取100G独家整理的学习资料哟~来源:https://dwz.cn/cLu4Iqqd面试官Q:你讲下线程状态中的...

犬小哈 1107

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

下次面试再一上来就问我线程有哪些状态,我上去就是给他一 jio

这是大厂面试系列,还原真实场景,把问题讲清楚。 点赞再看,养成习惯~ 微信搜索【武哥聊编程】,关注这个 Java 菜鸟。 是的,今天必须要把它给彻底根治了! 现在 Java 面试,基本上都会问到多线程,那么随之而来的线程状态,很多时候都会被问到,大部分人都知道线程的几种状态,但是让你整体全部串起来,做到面试时游刃有余,估计很多人记忆不是很清晰。 今天武哥就把这些全部给整了,下次面试官再问,就把...

8359

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【Java面试】线程状态,BLOCKED和WAITING有什么区别

BLOCKED是线程,是一个阻塞状态嘛。然后WAITING是线程是等待状态。区别就是阻塞是被动的,然后WAITING是一个条件的一个触发就是我们更多的是在就人工为主动的去触发线程的一种头等待的一个状态,所以我认为它们区别一个是在被动和主动的一个区别吧。好的,面试官。BLOCKED和WAITING都是属于线程的阻塞等待状态。BLOCKED状态是指线程在等待监视器锁的时候的阻塞状态。也就是在多...

跟着Mic学架构 3942

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

面试官让我讲下线程的 WAITING 状态,我笑了

面试官Q:你讲下线程状态中的WAITING状态,什么时候会处于这个状态?什么时候离开这个状态?小菜J 会心一笑...一个正在无限期等待另一个线程执行一个特别的动作的线程处于WAITING状...

hnjsjsac的博客 363

Java面试-线程的生命周期:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED

《Java线程生命周期解析:从创建到销毁的六种状态》 本文系统讲解了Java线程生命周期的六种状态及其转换关系。线程从NEW状态创建后,通过start()进入RUNNABLE状态,此时可能正在执行或等待CPU资源。当遇到同步锁竞争时,线程会进入BLOCKED状态;通过wait()或join()方法会进入WAITING状态无限期等待;而sleep()或带超时的wait()则使线程进入TIMED_WAITING状态。最终线程完成任务后进入TERMINATED终止状态。文章通过生动的代码示例和职场比喻,帮助开发者

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

blocked java线程_Java线程状态:BLOCKED与WAITING的区别

Doc说明:/*** Thread state for a thread blocked waiting for a monitor lock.* A thread in the blocked state is waiting for a monitor lock* to enter a synchronized block/method or* reenter a synchronized b...

weixin_32536777的博客 1197

关于Java线程,你必须掌握的知识点

Java线程 我为什么要写这篇文章?主要有一下几点: 加深自己对Java线程的理解 勘误网上有些错误的知识和认知 通过写文章,来交流思想 网上关于Java线程的文章数不胜数,实在太多了,我又怎么写一篇让其他人一看就懂,一看就会,一看就忘不掉的文章呢? 用假如我是面试官的场景和面试官的角度去深入分析Java线程相关的知识,下面就开始吧! NO1.你熟练使用Java线程,那么Java线...

独立开发者 6604

面试官:说说Java线程的状态及转换

这两个状态比较好理解,当创建一个线程后,还没有调用start()方法时,线程处在 NEW 状态,线程完成执行,退出后变为TERMINATED终止状态。然后,我们看到了run()方法的执行,这个执行,是在主线程main打印了调用start()方法后线程的状态为:RUNNABLE输出后执行的。我们设想一下,如果使用if,则在线程被唤醒后,会继续往下执行,不再判断条件是否符合,这时还是没有票,粉丝也就购买不到票了。简单来说,处于BLOCKED状态的线程,还是在竞争锁的,一旦cpu有时间,它竞争到了锁、就会执行。

m0_71777195的博客 987

sleep()的线程是什么状态

前两天面试,面试官问我:小伙子,你知道线程有几种状态吗? 呵,这也太简单了吧~ 我自信答道: 五种状态,分别是创建、就绪、运行、阻塞、死亡 面试官笑笑:那你知道调用sleep()之后是什么状态吗? Emm… 阻塞态?但是sleep()的线程是不会释放锁的呀,就绪态?可人家也不能运行呀… 面试官看着我抓耳挠腮的样子,冷笑道:回去再好好看吧… 其实,Java线程除了以上五种状态,还存在等待(WAITING) 和 超时等待(TIMED_WAITING) 两种状态 等待(WAITING) 处于这种状态的线程不会被分

Hawk的学习笔记 5796

图解线程状态,看完浑身通透

闪客:小宇你怎么了,我看你脸色很不好呀。小宇:今天去面试了,面试官问我 Java 线程的状态及其转化。闪客:哦哦,很常见的面试题呀,不是有一张状态流转图嘛。小宇:我知道,可是我每次面试...

码农翻身 1739
上一篇: 阿里巴巴JAVA岗发布+内部面试题(含P5-P7)
下一篇: 使用 Netty 实现 IM 聊天贼简单,看不懂就锤爆艿艿的狗头~
公众号-芋道源码
博客等级 码龄10年 1636粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值