线程——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类里面。

猜你喜欢

转载自www.cnblogs.com/Aaron-cell/p/12945422.html