博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java Thread 的 sleep() 和 wait() 的区别
阅读量:6614 次
发布时间:2019-06-24

本文共 2417 字,大约阅读时间需要 8 分钟。

 

 

 
 

1. sleep 和 wait 方法解释

sleep()方法是Thread类里面的,主要的意义就是让当前线程停止执行,让出cpu给其他的线程,但是不会释放对象锁资源以及监控的状态,当指定的时间到了之后又会自动恢复运行状态。

wait()方法是Object类里面的,主要的意义就是让线程放弃当前的对象的锁,进入等待此对象的等待锁定池,只有针对此对象调动notify方法后本线程才能够进入对象锁定池准备获取对象锁进入运行状态。

 

2. 实例

举个列子说明:

/** java中的sleep()和wait()的区别 */public class TestD {    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        publicvoid run(){            synchronized (TestD.class) {             System.out.println("enter thread1...");                 System.out.println("thread1 is waiting...");            try {            //调用wait()方法,线程会放弃对象锁,进入等待此对象的等待锁定池                TestD.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 (TestD.class) {                 System.out.println("enter thread2....");                 System.out.println("thread2 is sleep....");                //只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。                 TestD.class.notify();                //==================                //区别                //如果我们把代码:TestD.class.notify();给注释掉,即TestD.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!!!");            }        }    } }
运行效果:
enter thread1...thread1 is waiting...enter thread2....thread2 is sleep....thread2 is going on....thread2 is over!!!thread1 is going on ....thread1 is over!!!

TestD.class.notify();

运行效果:

enter thread1...thread1 is waiting...enter thread2....thread2 is sleep....thread2 is going on....thread2 is over!!!

相信看完例子应该就知道二者的区别了。

转载地址:http://yghso.baihongyu.com/

你可能感兴趣的文章
CSS-图片不变形设置
查看>>
Git异常:fatal: could not create work tree dir 'XXX': No such file or directory
查看>>
GNU make manual 翻译(八十二)
查看>>
python批量下载图片的三种方法
查看>>
/bin/bash^M: bad interpreter: 没有那个文件或目录
查看>>
iOS - OC NSData 数据
查看>>
Java web 开发填坑记 1 -如何正确的下载 eclipse
查看>>
iOS - Quartz 2D 第三方框架 Charts 绘制图表
查看>>
MM顾问的常见面试问题(ZZ)
查看>>
转:Windows 8上强制Visual Studio以管理员身份运行
查看>>
迟来的加勒比海盗3 观后
查看>>
类与对象 - PHP手册笔记
查看>>
谈一谈互联网创业补贴变味后的现象
查看>>
MapGIS转Shp文件的单位问题
查看>>
使用Karate轻松实现自动API测试
查看>>
React
查看>>
CentOS -bash: warning: setlocale: LC_MESSAGES: cannot change locale (en_US.UTF-8)
查看>>
编写一个基本的Android应用程序
查看>>
我的友情链接
查看>>
查看Linux操作系统安装的位数(getconf 命令应用)
查看>>