zoukankan      html  css  js  c++  java
  • JAVA线程sleep与wait区别

    sleep就是正在执行的线程主动让出cpu,cpu去执行其他线程,在sleep指定的时间过后,cpu才会回到这个线程上继续往下执行,如果当前线程进入了同步锁,sleep方法并不会释放锁,即使当前线程使用sleep方法让出了cpu,但其他被同步锁挡住了的线程也无法得到执行。

    wait是指在一个已经进入了同步锁的线程内,让自己暂时让出同步锁,以便其他正在等待此锁的线程可以得到同步锁并运行,只有其他线程调用了notify方法(notify并不释放锁,只是告诉调用过wait方法的线程可以去参与获得锁的竞争了,但不是马上得到锁,因为锁还在别人手里,别人还没释放。如果notify方法后面的代码还有很多,需要这些代码执行完后才会释放锁,可以在notfiy方法后增加一个等待和一些代码,看看效果),调用wait方法的线程就会解除wait状态和程序可以再次得到锁后继续向下运行。

    测试代码:

    public class MyThread1 implements Runnable {
    
    	/*
    	 *  由于这里的MyThread1和下面的MyThread2内部run方法要用同一对象作为监视器,我们这里不能用this,因为在MyThread2里面的this和这个MyThread1的this不是同一个对象。
    	 *  我们用MultiThread.class这个字节码对象,当前虚拟机里引用这个变量时,指向的都是同一个对象。
    	 */
    	public void run() {
    		synchronized (MutiThread.class) {
    			System.out.println("进入MyThread1...");
    			System.out.println("MyThread1 is waiting...");
    			
    			try {
    				// 释放锁有两种方式,第一种方式是程序自然离开监视器的范围,也就是离开了synchronized关键字管辖的代码范围,另一种方式就是在synchronized关键
    				// 字管辖的代码内部调用监视器对象的wait方法。这里,使用wait方法释放锁。
    				MutiThread.class.wait();
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			
    			System.out.println("结束MyThread1...");
    		}
    
    	}
    
    }
    
    public class MyThread2 implements Runnable {
    
    	public void run() {
    		synchronized (MutiThread.class) {
    			System.out.println("进入MyThread2...");
    			System.out.println("MyThread2 通知别的线程可以释放wait状态");
    			// 由于notify方法并不释放锁,即使MyThread2调用下面的sleep方法休息了10毫秒,
    			//但MyThread1仍然不会执行,因为MyThread2没有释放锁,所以MyThread1无法得不到锁。
    			MutiThread.class.notify();
    			
    			System.out.println("MyThread2 睡眠10秒");
    			 try {
                     for(int i=1;i<=10;i++){
                    	 System.out.println("睡觉"+i+"秒");
                    	 Thread.sleep(1000);
                     }
                 } catch (InterruptedException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
                 }
                 System.out.println("结束MyThread2");
    		}
    
    	}
    
    }
    
    public class MutiThread {
    
    	public static void main(String[] args) {
    		new Thread(new MyThread1()).start();
    		new Thread(new MyThread2()).start();
    
    	}
    
    }

    运行结果:

    进入MyThread1...
    MyThread1 is waiting...
    进入MyThread2...
    MyThread2 通知别的线程可以释放wait状态
    MyThread2 睡眠10秒
    睡觉1秒
    睡觉2秒
    睡觉3秒
    睡觉4秒
    睡觉5秒
    睡觉6秒
    睡觉7秒
    睡觉8秒
    睡觉9秒
    睡觉10秒
    结束MyThread2
    结束MyThread1...

  • 相关阅读:
    SpringBoot之OAuth2.0学习之客户端快速上手
    SpringBoot之oauth2.0学习之服务端配置快速上手
    基于Docker+Prometheus+Grafana监控SpringBoot健康信息
    SpringBoot+kafka+ELK分布式日志收集
    springmvc的异步处理
    WebFlux基础之响应式编程
    Webflux快速入门
    深入理解Spring的ImportSelector接口
    深入理解Spring的异步机制
    SpringSecurity学习之自定义过滤器
  • 原文地址:https://www.cnblogs.com/foxting/p/8435270.html
Copyright © 2011-2022 走看看