线程——sleep()和wait()方法区别
Posted aaron-cell
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程——sleep()和wait()方法区别相关的知识,希望对你有一定的参考价值。
Java中sleep和wait方法的区别:
由图可知:sleep和wait最大区别在于
a. 线程调用sleep方法,线程进入休眠状态,且会继续占有锁,不会释放
b.锁对象调用wait方法,线程进入到一个和该对象相关的等待池中,同时失去(释放)了对象的机锁。
这里以窗口售票为例:
TicketDemo类:
public class TicketDemo { public static void main(String[] args) { Ticket ticket1 = new Ticket(); Ticket ticket2 = new Ticket(); Ticket ticket3 = new Ticket(); Thread thread1 = new Thread(ticket1, "ticket1"); Thread thread2 = new Thread(ticket2, "ticket2"); Thread thread3 = new Thread(ticket3, "ticket3"); thread1.start(); thread2.start(); thread3.start(); } }
Ticket类:
public class Ticket implements Runnable { //定义锁对象 public static Lock lock = new Lock(); public void run() { lock.sellTicket(); } }
Lock类:
public class Lock { private int ticktNum = 100; public synchronized void sellTicket(){ while (ticktNum > 0){ //1.打印线程号和票号,票数减1 String name = Thread.currentThread().getName(); System.out.println("线程"+name+"售票:"+ticktNum--); try { //Thread.sleep(1000);休眠一秒 this.wait(2000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
运行结果一:将Thread.sleep(1000)放开,将this.wait(2000)注释
运行结果二:将Thread.sleep(1000)注释,将this.wait(2000)放开:
总结:使用Thread.sleep()线程方法,线程进入休眠但不会释放拥有的锁,其他线程进入不了同步方法。使用锁对象的wait方法时,该线程回到对象的等待池等待,同时释放锁。
Java中sleep和wait方法的几个注意点:
1.Thread.sleep()方法用来暂停线程的执行,将CPU放给线程调度器。
2.Thread.sleep()方法是一个静态方法,它暂停的是当前执行的线程。
3.Java有两种sleep方法,一个只有一个毫秒参数,另一个有毫秒和纳秒两个参数。
4.与wait方法不同,sleep方法不会释放锁。
5.如果其他的线程中断了一个休眠的线程,sleep方法会抛出Interrupted Exception。
6.休眠的线程在唤醒之后不保证能获取到CPU,它会先进入就绪态,与其他线程竞争CPU。
7.有一个易错的地方,当调用t.sleep()的时候,会暂停线程t。这是不对的,因为Thread.sleep是一个静态方法,它会使当前线程而不是线程t进入休眠状态。
8.wait方法必须正在同步环境下使用,比如synchronized方法或者同步代码块。如果你不在同步条件下使用,会抛出IllegalMonitorStateException异常。另外,sleep方法不需要再同步条件下调用,你可以任意正常的使用。
9.wait方法用于和定义于Object类的,而sleep方法操作于当前线程,定义在java.lang.Thread类里面。
以上是关于线程——sleep()和wait()方法区别的主要内容,如果未能解决你的问题,请参考以下文章