Java 中sleep()和wait()两者的区别

对于这两者的区别,我刚开始巧案例时用Thread进行联想怎么都出不来wait()这个方法,查API之后才明白:Sleep()方法是属于Thread类中的,而wait()方法是属于Object类的。

sleep方法是使当前线程休眠一段时间,让出CPU给其他线程,但是它的监控状态依然保持着,当时间结束后又会自动恢复运行状态。该方法不会释放对象锁。

wait()方法被调用时,会释放对象锁,进入此对象的等待锁定池。只有针对此对象调用notify()方法后该线程才会进入对象锁定池准备,获取对象锁进入运行状态。案例如下:

package com.lff.demo2;

/**
 * 
 * @author Hope_lee
 * @date 2018年10月8日 上午12:29:14
 */
public class LFFTest {
	
	public static void main(String[] args) {
		
		new Thread(new Thread1()).start();
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		new Thread(new Thread2()).start();
	}
	
	private static class Thread1 implements Runnable{
		
		@Override
		public void run() {
			synchronized (LFFTest.class) {
				
				System.out.println("Thread1 is ready");
				System.out.println("Thread1 is waiting");
				
				try {
					//调用wait方法
					LFFTest.class.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println("Thread1 is restart");
				System.out.println("Thread1 is over!");
			}
			
		}
		
	}
	
	private static class Thread2 implements Runnable{

		@Override
		public void run() {
			
			synchronized (LFFTest.class) {
				
				System.out.println("Thread2 is ready");
				System.out.println("Thread2 is sleeping");
				//唤醒Thread1,有无该行代码输出的结果完全不同
				LFFTest.class.notify();
				try {
					Thread.sleep(3000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println("Thread2 is restart");
				System.out.println("Thread2 is over!");
				
			}
			
		}
		
	}

}

当调用notify()方法时,控制台输出的结果是:

当Thread2类中没有调用notify()时,输出的结果如下:

猜你喜欢

转载自blog.csdn.net/Hope_lee/article/details/82962931