zoukankan      html  css  js  c++  java
  • Java线程wait和sleep的区别

    Java中调用wait方法或者sleep方法都可以让线程进入waitint或者time-waiting状态,但是它们还是

    有所不同的:

    1. wait是Object中的方法,而sleep则是Thread中的方法。
    2. sleep可以在任何地方使用,而wait只可以在synchronized方法或synchronized块中使用。
    3. sleep方法只会让出当前线程持有的时间片,而wait方法除了让出时间片还会让出当前线程持有的锁。

      如何证明呢?我设计了如下代码来证明:

     1 package com.basic.thread;
     2 
     3 /**
     4  * @author zhangxingrui
     5  * @create 2019-02-20 21:37
     6  **/
     7 public class WaitAndSleepDemo {
     8 
     9     public static void main(String[] args) {
    10         final Object object = new Object();
    11 
    12         try {
    13             new Thread(new Runnable() {
    14                 @Override
    15                 public void run() {
    16                     System.out.println("线程A开始");
    17                     synchronized (object){
    18                         try {
    19                             System.out.println("线程A获取到锁");
    20                             object.wait(1000);
    21                             System.out.println("线程A结束");
    22                         } catch (InterruptedException e) {
    23                             e.printStackTrace();
    24                         }
    25                     }
    26                 }
    27             }).start();
    28 
    29             Thread.sleep(100);
    30 
    31             new Thread(new Runnable() {
    32                 @Override
    33                 public void run() {
    34                     System.out.println("线程B开始");
    35                     synchronized (object){
    36                         try {
    37                             System.out.println("线程B获取到锁");
    38                             Thread.sleep(1000);
    39                             System.out.println("线程B结束");
    40                         } catch (InterruptedException e) {
    41                             e.printStackTrace();
    42                         }
    43                     }
    44                 }
    45             }).start();
    46         }catch (InterruptedException e){
    47             e.printStackTrace();
    48         }
    49     }
    50 
    51 }

      输出结果:

      该段代码的原理是先执行线程A,在进入synchonized之后调用wait方法,这个时候线程B也开始执行了;

    而如果wait方法会释放锁的话,则B线程可以进入synchonized块中执行,执行完毕后才释放锁给A线程继续执行。

  • 相关阅读:
    原生js实现基本选择器
    javascript数组
    web中关于隐藏与显示
    CSS3 box-shadow(阴影使用)
    java中文件的I/O操作
    组件RecyclerView的应用(一)
    Android客户端与Eclipse服务器端的Socket通信
    C语言关于利用sscanf实现字符串相加减
    TabLayout和ViewPager简单实现页卡的滑动
    DrawerLayout的openDrawer()和closeDrawer()方法
  • 原文地址:https://www.cnblogs.com/alinainai/p/10409606.html
Copyright © 2011-2022 走看看