ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

线程——sleep()和wait()方法区别

2020-05-24 12:06:58  阅读:220  来源: 互联网

标签:Thread 线程 sleep Ticket 方法 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类里面。

标签:Thread,线程,sleep,Ticket,方法,wait
来源: https://www.cnblogs.com/Aaron-cell/p/12945422.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有