1. sleep 和 wait 方法解释

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

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

2. 实例

举个列子说明:

  1. /** java中的sleep()和wait()的区别 */
  2. public class TestD {
  3.  
  4. public static void main(String[] args) {
  5. new Thread(new Thread1()).start();
  6. try {
  7. Thread.sleep(5000);
  8. } catch (Exception e) {
  9. e.printStackTrace();
  10. }
  11. new Thread(new Thread2()).start();
  12. }
  13.  
  14. private static class Thread1 implements Runnable{
  15. @Override
  16. publicvoid run(){
  17. synchronized (TestD.class) {
  18. System.out.println("enter thread1...");
  19. System.out.println("thread1 is waiting...");
  20. try {
  21. //调用wait()方法,线程会放弃对象锁,进入等待此对象的等待锁定池
  22. TestD.class.wait();
  23. } catch (Exception e) {
  24. e.printStackTrace();
  25. }
  26. System.out.println("thread1 is going on ....");
  27. System.out.println("thread1 is over!!!");
  28. }
  29. }
  30. }
  31.  
  32. private static class Thread2 implements Runnable{
  33. @Override
  34. public void run(){
  35. synchronized (TestD.class) {
  36. System.out.println("enter thread2....");
  37. System.out.println("thread2 is sleep....");
  38. //只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。
  39. TestD.class.notify();
  40. //==================
  41. //区别
  42. //如果我们把代码:TestD.class.notify();给注释掉,即TestD.class调用了wait()方法,但是没有调用notify()
  43. //方法,则线程永远处于挂起状态。
  44. try {
  45. //sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,
  46. //但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。
  47. //在调用sleep()方法的过程中,线程不会释放对象锁。
  48. Thread.sleep(5000);
  49. } catch (Exception e) {
  50. e.printStackTrace();
  51. }
  52. System.out.println("thread2 is going on....");
  53. System.out.println("thread2 is over!!!");
  54. }
  55. }
  56. }
  57. }
运行效果:
  1. enter thread1...
  2. thread1 is waiting...
  3. enter thread2....
  4. thread2 is sleep....
  5. thread2 is going on....
  6. thread2 is over!!!
  7. thread1 is going on ....
  8. thread1 is over!!!

如果注释掉代码:

  1. TestD.class.notify();

运行效果:

  1. enter thread1...
  2. thread1 is waiting...
  3. enter thread2....
  4. thread2 is sleep....
  5. thread2 is going on....
  6. thread2 is over!!!

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

Java并发编程:Java Thread 的 run() 与 start() 的区别的更多相关文章

  1. Java并发编程:Thread类的使用

    Java并发编程:Thread类的使用 在前面2篇文章分别讲到了线程和进程的由来.以及如何在Java中怎么创建线程和进程.今天我们来学习一下Thread类,在学习Thread类之前,先介绍与线程相关知 ...

  2. 【转】Java并发编程:Thread类的使用

    一.线程的状态 在正式学习Thread类中的具体方法之前,我们先来了解一下线程有哪些状态,这个将会有助于对Thread类中的方法的理解. 线程从创建到最终的消亡,要经历若干个状态.一般来说,线程包括以 ...

  3. 3、Java并发编程:Thread类的使用

    Java并发编程:Thread类的使用 在前面2篇文章分别讲到了线程和进程的由来.以及如何在Java中怎么创建线程和进程.今天我们来学习一下Thread类,在学习Thread类之前,先介绍与线程相关知 ...

  4. Java并发编程-Java内存模型

    JVM内存结构与Java内存模型经常会混淆在一起,本文将对Java内存模型进行详细说明,并解释Java内存模型在线程通信方面起到的作用. 我们常说的JVM内存模式指的是JVM的内存分区:而Java内存 ...

  5. Java并发编程:Thread类的使用介绍

    在学习Thread类之前,先介绍与线程相关知识:线程的几种状态.上下文切换,然后接着介绍Thread类中的方法的具体使用. 以下是本文的目录大纲: 一.线程的状态 二.上下文切换 三.Thread类中 ...

  6. Java并发编程:Thread类的使用(转载)

    一:线程的状态: 在正式学习Thread类中的具体方法之前,我们先来了解一下线程有哪些状态,这个将会有助于后面对Thread类中的方法的理解. 线程从创建到最终的消亡,要经历若干个状态.一般来说,线程 ...

  7. Java并发编程:Java Thread 的 sleep() 和 wait() 的区别

      1. start 和 run 方法解释: 1) start: 用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码.通过调用Thread类 ...

  8. Java并发编程--1.Thread和Runnable

    创建线程 Java有两种方式创建线程, 继承Thread类和实现Runnable接口 继承Thread 步骤: 1.自定义一个类继承Thread类, 重写run方法 2.创建自定义类的对象,调用sta ...

  9. Java并发编程:Java Thread方法join的简单总结

    虽然关于讨论线程join方法的博客已经很多了,不过个人感觉挺多都讨论得不够全面,所以我觉得有必要对其进行一个全面的总结. 一.作用 Thread类中的join方法的主要作用就是同步,它可以使得线程之间 ...

随机推荐

  1. 使用Vivado的block design

    使用Vivado的block design (1)调用ZYNQ7 Processing System (2)配置ZYNQ7系统 (3)外设端口配置 根据开发板原理图MIO48和MIO49配置成了串口通 ...

  2. pytest学习笔记

    From: https://blog.csdn.net/gaowg11/article/details/54910974 由于对测试框架了解比较少,所以最近看了下pytest测试框架,对学习心得做个记 ...

  3. Lucene 4.3 - Facet demo

    package com.fox.facet; import java.io.IOException; import java.util.ArrayList; import java.util.List ...

  4. Android adb logcat输出日志显示不全解决方案

    在终端中使用adb logcat打印服务器json数据,如果返回数据过大超过4000字节(4K)即会截断不显示 原因:logcat在对于message的内存分配大概是4k左右.所以超过的内容都直接被丢 ...

  5. Js之事件循环(执行机制)

    js的执行机制是事件循环 什么是事件循环? js引擎在执行代码时,首先会将同步代码加入到主线程中,异步代码会放到event table中注册回调函数, 当主线程空闲之后,event table中的回调 ...

  6. bzoj4812: [Ynoi2017]由乃打扑克

    由于查询的是树链的并的信息,同时信息不能高效合并,只能考虑用bitset维护,小范围暴力预处理以便从bitset算出答案 对树分块,保证每块是连通的且直径较小,对分出的块缩点建新树,在新树上建树上ST ...

  7. 信息安全-加密:RAS 加密

    ylbtech-信息安全-加密:RAS 加密 1.返回顶部 1. RSA 是不对称的加密(加密密钥和解密密钥不同  其中 一个为公钥,一个为私钥): 公钥和私钥的产生是基于一对很大的素数(十进制来说 ...

  8. Nodejs使用多个分隔符分隔字符串

    在nodejs中当需要使用多个分隔符分隔字符串时,可以使用正则表达式作为split函数的参数,具体使用如下: var str = "111@222#333 444@555# 666 777& ...

  9. android 照片旋转并保存

    /** * 读取图片属性:旋转的角度 * @param path 图片绝对路径 * @return degree旋转的角度 */ public int readPictureDegree(String ...

  10. mongodb windows的安装方法和添加到任务管理器中、检测是否成功、增删改查命令

    转: mongodb安装方法: https://blog.csdn.net/heshushun/article/details/77776706        mongodb检测安装成功 .以及增删改 ...