JAVA-初步认识-第十四章-多线程-wait和sleep的区别

一.

wait和sleep的方法有些类似,我们现在要对其进行描述,区分它们。

wait方法在object类中,而且有两种形式,分别是wait()和wait(long timeout),我们关注后者。

参数的截图中表明wait方法可以醒。

等待和睡眠的区别,睡眠是可以醒过来的,但是等待有可能是无休止的。

两者一个是object方法,一个是thread方法。

sleep能不醒,不需要被人叫。sleep拿着锁,别人进不来。

现在讲述一些有趣的,可能颠覆以往的概念。

这两个是同一个锁,t0,t1,t2三个线程全部冲入show方法,全部都卧倒了。t0拿到锁this,进入同步代码块,就wait了。一wait就等在这儿了,就进入线程池了,接着就释放执行权了,也释放锁了。因为在另外的method方法中,有可能有notify,要不然t4怎么救t0~t2,

t0一挂,t1,t2,t4就抢执行权了。t1拿到执行权和锁,进来后也wait了,同样的t2也会挂在这。

现在要说的是这个问题,t4进来,notifyAll,上面的三个线程全都活了。这就有问题,在同步中,某一个时刻只能有一个线程执行,现在有三个在里面活着,怎么办?

在外面进不来就安全了,现在都进来了,这下面还有共性代码,多条语句,这三个线程一操作就挂了,

三个线程都活着,都在等待着执行权,cpu如果切换到t0上,这时候t0也不见得就运行。因为这上下的所有线程都在同步当中,在同步当中,你想要运行,得具备一个资格,你得持有锁。t4一个notifyAll,上面三个线程都活了,只能说明它们都具备了资格,但是t4还拿着锁呢?t4还没出来呢,t4从同步中一出来,锁就放了。这一放,上面三个线程就有一个切到执行权上,它就会获得锁。如果t0获得锁了,它就执行,这时t1和t2是不可能执行的,除非t0出去,否则它们执行不了。

同步里面一个时刻只能有一个线程能够执行,但是活的线程不止一个。谁拿锁谁执行。

时间: 2024-07-31 09:42:38

JAVA-初步认识-第十四章-多线程-wait和sleep的区别的相关文章

java 面向对象编程--第十四章 多线程编程

1.  多任务处理有两种类型:基于进程和基于线程. 2.  进程是指一种“自包容”的运行程序,由操作系统直接管理,直接运行,有自己的地址空间,每个进程一开启都会消耗内存. 3.  线程是进程内部单一的顺序控制流.一个进程拥有多个线程.多个线程共享一个进程的内存空间. 4.  基于进程的特点是允许计算机同时运行两个或更多的程序. 5.  基于线程的多任务处理环境中,线程是最小的处理单位. 6.  基于进程所需的开销更少:每个进程都需要操作系统为其分配独立的内存空间:同意进程中的所有线程都在同意内存

201671010107 2016-2017-2 《Java程序设计》第十四章学习心得

通过这一章的学习,我知道了程序,进程和线程之间的关系,知道了Java实现多线程的两种途径:1.创建Thread类的子类:2.在程序中定义实现Runnable接口的类.线程的中断,线程的六种状态,多线程调度,守护线程,线程的同步等.

No_16_0325 Java基础学习第二十四天—多线程学习总结

文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 2016.03.25 lutianfei none 第十章 多线程 多线程概述 什么是进程? 进程:就是正在运行的程序. 进程是系统进行资源分配和调用的独立单位.每一个进程都有它自己的内存空间和系统资源. 多进程有什么意义呢? 可以在一个时间段内执行多个任务. 可以提高CPU的使用率. 什么是线程呢? 在同一个进程内又可以执行多个任务,而这每一个任务我就可以看出是一个线程. 线程:是程序的执行单元,执行路径.是程序使用CPU的最

JAVA基础之(十四)--“多线程”

菜鸟里写的暂时够用了,菜鸟 不充点: 如果只想重写 run() 方法,而不重写其他 Thread 方法,那么应使用 Runnable 接口.这很重要,因为除非程序员打算修改或增强类的基本行为,否则不应为该类创建子类[java的api建议] 菜鸟中只有前半部分,线程同步,死锁等需要看书:重在理解概念和应用: 原文地址:https://www.cnblogs.com/silence-fire/p/9756442.html

JAVA-初步认识-第十四章-多线程-停止线程方式-定义标记

一. 线程既然开启了,运行了,冻结又恢复运行了,那什么时候消亡呢? 怎么来停止线程呢?不能一直在运行. 线程怎么停,线程自己最清楚.在Thread类中,提供了stop方法, 本来线程持有一个锁,只要stop,它就什么都在放,这是强制操作,无论出于什么状态,强制将其搞定.本来wait,这那儿的,stop一下子就没了. stop方法做的不是状态切换了,而是消失. 线程停止,其实只有一种,就是run方法结束. 线程一旦没有自己运行的代码了,任务没有了,线程自动就结束了.可是线程的任务怎么能没有呢? 标

JAVA-初步认识-第十四章-多线程-停止线程方式-interrupt

一. 结合上一节继续讲述,不要以为设置了标记线程就能停止,依旧有停不下来的情况. 整个函数就是添加了wait()方法,导致try-catch的加入. DOS结果显示,程序没有停下来,和主线程结束了.其余两个线程都没结束,都处于等待状态. 这两个线程拿到锁进来后,都wait停在这了. 设置标记也没用,因为这两个线程就没读到标记. 有人说采用notify方法,但是notify要在同一个锁中,在这个程序中放不了. 如果程序中不用wait,用sleep呢?而且sleep时间比较长,比如说一个小时,没有一

JAVA-初步认识-第十四章-多线程(守护线setDaemon)

一. 除了interrupt方法,还有其他方法, 我们要介绍线程类中常见的一些方法,比如说setDaemon, 还是结合之前的例子来讲解,t1和t2两个线程,我们中断了一个,另一个没有中断,那么DOS结果就结束不了. 可是如果在开启t2之前,将其设置成守护线程的话,守护听不懂,可以将它认为是后台线程.以前认识的线程都是前台线程, DOS结果显示为结束了. 两者有什么区别呢?后台线程的特点在于,它和前台线程都正常进行开启,就是结束不一样,运行都一样,互相抢夺cpu的执行权,结束的时候,前台线程必须

Java(第十四章)

第十四章 1.Java中的包(package) 2.1 包,对应到磁盘中的文件夹 2.2 新建一个class,默认保存在缺省包中 2.3 声明包的关键字:package package语句,置顶位置 2.4 导入包的关键字:import import 包名.类名(*表示所有); 2.5 作用: 分类存放,解决同名冲突.方便查找和管理 2.6 命名规范 l  Java包名通常由小写字母组成,不能以圆点开头或结尾. l  一个唯一包名的前缀通常是全部小写的ASCII字母,并且是一个顶级域名com.e

JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制

JAVA之旅(十四)--静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制 JAVA之旅,一路有你,加油! 一.静态同步函数的锁是class对象 我们在上节验证了同步函数的锁是this,但是对于静态同步函数,你又知道多少呢? 我们做一个这样的小实验,我们给show方法加上static关键字去修饰 private static synchronized void show() { if (tick > 0) { try { Thread