1、每个对象都有一个锁来控制同步访问,Synchronized关键字可以和对象的锁交互,来实现同步方法或同步块。sleep()方法正在执行的线程主动让出CPU(然后CPU就可以去执行其他任务),在sleep指定时间后CPU再回到该线程继续往下执行(注意:sleep方法只让出了CPU,而并不会释放同步资源锁!!!);wait()方法则是指当前线程让自己暂时退让出同步资源锁,以便其他正在等待该资源的线程得到该资源进而运行,只有调用了notify()方法,之前调用wait()的线程才会解除wait状态,可以去参与竞争同步资源锁,进而得到执行。(注意:notify的作用相当于叫醒睡着的人,而并不会给他分配任务,就是说notify只是让之前调用wait的线程有权利重新参与线程的调度);

2、sleep()方法可以在任何地方使用;wait()方法则只能在同步方法或同步块中使用;

3、sleep()是线程线程类(Thread)的方法,调用会暂停此线程指定的时间,但监控依然保持,不会释放对象锁,到时间自动恢复;wait()是Object的方法,调用会放弃对象锁,进入等待队列,待调用notify()/notifyAll()唤醒指定的线程或者所有线程,才会进入锁池,不再次获得对象锁才会进入运行状态;

举个列子说明:

public class ThreadTest {

    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();
} public static class Thread1 implements Runnable { @Override
public void run() { synchronized (ThreadTest.class) {
System.out.println("进入thread1...");
System.out.println("thread1是等待...");
try {
//调用wait()方法,线程会放弃对象锁,进入等待此对象的等待锁定池
ThreadTest.class.wait();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("thread1正在进行 ....");
System.out.println("thread1结束!!!");
}
} } private static class Thread2 implements Runnable { @Override
public void run() {
synchronized (ThreadTest.class) {
System.out.println("进入thread2...");
System.out.println("thread2是睡眠");
//只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。
ThreadTest.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正在进行....");
System.out.println("thread2结束!!!");
}
} }

运行效果:

如果注释掉代码:

 ThreadTest.class.notify();

最新文章

  1. iptables
  2. 二维码扫描利用ZBar实现
  3. [转]MMORPG服务器架构
  4. php 使用phpmailer 发送邮件(附带中文乱码的解决方法)
  5. java静态代码块、初始化块和构造方法的执行顺序
  6. Linux进程间通信IPC学习笔记之管道
  7. 在birt中解决引用了不存在的绑定出现的问题
  8. MySQL、Oracle数据库之操作系统版本选择
  9. 实现ssr服务端渲染
  10. Waiting for table metadata lock
  11. echarts和highcharts比较
  12. ES5和ES6中关于import & export的书写方式的区别
  13. ThinkPHP5自定义分页样式
  14. CSS-3 box-shadow 的使用
  15. MikroTik RouterOS 6.x版本开始支持使用img镜像安装(U盘安装的终极解决方法)
  16. 今日Java——Cay Horstmann访谈
  17. Codeforces D - High Load
  18. 谈谈我的js学习过程(二)——“Hello World!”
  19. spring-boot-全局异常
  20. Linux 下让终端走代理的方法

热门文章

  1. window10下搭建ELK环境
  2. Java——HashMap底层源码分析
  3. 题解 AT1357 【n^p mod m】
  4. JetBrains插件
  5. WordPress用户的权限类
  6. 基于ELK进行邮箱访问日志的分析
  7. vue项目引入外部字体
  8. 初学ctypes:打开进程并返回相关信息
  9. 【学习】018 Spring框架
  10. Java并发-CycliBarrier