java打断sleep_Java中sleep()和wait()的区别
1、这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类。
sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用了b的sleep方法,实际上还是a去睡觉,要让b线程睡觉要在b的代码中调用sleep。
2.最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
sleep不出让系统资源;wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。一般wait不会加时间限制,因为如果wait线程的运行资源不够,再出来也没用,要等待其他线程调用notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断。
Thread.Sleep(0)的作用是“触发操作系统立刻重新进行一次CPU竞争”。
3、使用范围:wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
synchronized(x){
x.notify()
//或者wait()
}
4、sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
总结
两者都可以暂停线程的执行。
对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。
Wait 通常被用于线程间交互/通信,sleep 通常被用于暂停执行。
sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。
在调用sleep()方法的过程中,线程不会释放对象锁。
而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备,获取对象锁进入运行状态。线程不会自动苏醒。
什么意思呢?
举个列子说明:
public static void main(String[] args) {
new Thread(new Thread1()).start();
try {
Thread.sleep(5000);
} catch (Exception e) {
e.printStackTrace();
}
new Thread(new Thread2()).start();
}
private static class Thread1 implements Runnable{
@Override
public void run(){
synchronized (MyTestDemo.class) {
System.out.println("enter thread1...");
System.out.println("thread1 is waiting...");
try {
//调用wait()方法,线程会放弃对象锁,进入等待此对象的等待锁定池
MyTestDemo.class.wait();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("thread1 is going on ....");
System.out.println("thread1 is over!!!");
}
}
}
private static class Thread2 implements Runnable {
@Override
public void run() {
synchronized (MyTestDemo.class) {
System.out.println("enter thread2....");
System.out.println("thread2 is sleep....");
//只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。
MyTestDemo.class.notify();
//==================
//区别
//如果我们把代码:MyTestDemo.class.notify();给注释掉,MyTestDemo.class调用了wait()方法,但是没有调用notify()
//方法,则线程永远处于挂起状态。
try {
//sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,
//但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。
//在调用sleep()方法的过程中,线程不会释放对象锁。
Thread.sleep(5000);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("thread2 is going on....");
System.out.println("thread2 is over!!!");
}
}
}
运行效果:
thread1 is waiting...
enter thread2....
thread2 is sleep....
thread2 is going on....
thread2 is over!!!
thread1 is going on ....
thread1 is over!!!
如果注释掉代码
MyTestDemo.class.notify();
运行效果:
enter thread1...
thread1 is waiting...
enter thread2....
thread2 is sleep....
thread2 is going on....
thread2 is over!!!
程序会一直处于挂起状态。
java打断sleep_Java中sleep()和wait()的区别相关推荐
- 【Java】泛型中 extends 和 super 的区别?
<? extends T>和<? super T>是Java泛型中的"通配符(Wildcards)"和"边界(Bounds)"的概念. ...
- 【java】深入理解Java JVM虚拟机中init和clinit的区别
1.概述 转载并且补充:深入理解Java JVM虚拟机中init和clinit的区别 原创 之所以来转载一下,是因为,有个学弟问了这个问题 这个知识点,回顾起来应该是我看 深入理解Java JVM虚拟 ...
- 20200927:Java和Cpp中栈与队列的区别
Java和Cpp中栈与队列的区别 题目 思路与算法 代码实现 对比分析两种语言中栈和队列的区别 题目 1.225. 用队列实现栈 2.232. 用栈实现队列 3.155. 最小栈 思路与算法 三道简单 ...
- java中的wait和sleep_java中wait和sleep的区别
java中wait和sleep的区别 在本篇文章中,我们将会讨论一下java中wait()和sleep()方法的区别.并讨论一下怎么使用这两个方法. Wait和sleep的区别 wait() 是Obj ...
- Java for 循环中++i和i++的区别
语法 for (语句1; 语句2; 语句3) { 被执行的代码块 } 语句 1 在循环(代码块)开始前执行 语句 2 定义运行循环(代码块)的条件 语句 3 在循环(代码块)已被执行之后执行(这就是循 ...
- java面试 内存中堆和栈的区别
java中的内存,分为两种,一为堆内存,二为栈内存. 栈内存 在函数中定义的基本类型的变量和对象的引用变量都是在函数的栈内存中分配. 当在一段代码块中声明了一个变量时,java就会在栈内存中为这个变量 ...
- java integer == int_Java中int和Integer的区别详解
1.Java 中的数据类型分为基本数据类型和复杂数据类型 int是前者>>integer 是后者(也就是一个类) 2.初始化时>> int i =1; Integer i= n ...
- java arraylist lik_java中ArrayList 、LinkList的区别分析
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问get和set,ArrayList优于LinkedList,因为ArrayList可以随 ...
- java的collections_Java中Collection和Collections的区别
1) 排序(Sort) 使用sort方法可以根据元素的自然顺序 对指定列表按升序进行排序.列表中的所有元素都必须实现 Comparable 接口.此列表内的所有元素都必须是使用指定比较器可相互比较的 ...
最新文章
- interrupt 1 using 1
- TensorBoard不是内部或外部指令也不是可运行的程序(已解决)
- kill linux 信号量,kill用法详细解释(特别是信号量9的使用以及理解)
- DHTML4(select与checkbox应用)
- cocos2d-x初探学习笔记(7)--CCProgressTimer
- 数字金融欺诈行为名词表
- OpenStack Orchestration service (编排服务Heat)
- 62. KVOController详解
- QTP是什么、QTP录制回放的原理、loadrunner、Selenium、QTP三者区别?QTP下载地址
- 阻滞增长模型求解_马尔萨斯与阻滞增长模型对于人口预测的分析
- C语言根据汉字拼音首字母排序
- Spring实例(DI注入)——女生追男生
- Amcharts 入门教程
- 为什么BAT公司宁愿花25K重新招人,也不愿花20K留住老员工?
- 来来来,一起来pick宏基因组binning分析工具
- python将一个字符串反转并输出_逆转字符串—输入一个字符串,将其逆转并输出。...
- 巴特沃斯数字低通滤波器的设计
- 计算机科学引论2021英文,计算机科学引论= Computer Science Illuminated : 第3版 : 英文...
- Unity2D游戏使游戏角色跳跃的脚本(包括长按跳跃加成)
- 业务需求近期准备深度学习下SpringCloud为加深印象提高学习效果故做此笔记以备后面复习查看之用