Java sleep wait 在多线程中的区别

来源:互联网 发布:android性能优化工具 编辑:程序博客网 时间:2024/06/11 14:31


sleep用于线程控制,而wait用于线程间的通信,与wait配套的方法还有notify和notifyAll.



区别一:

sleep是Thread类的方法,是线程用来 控制自身流程的,比如有一个要报时的线程,每一秒中打印出一个时间,那么我就需要在print方法前面加上一个sleep让自己每隔一秒执行一次。就像个闹钟一样。

wait是Object类的方法,用来线程间的通信,这个方法会使当前拥有该对象锁的进程等待直到其他线程调用notify方法时再醒来,不过你也可以给他指定一个时间,自动醒来。这个方法主要是用走不同线程之间的调度的。

区别二 :

关于锁的释放 ,在这里假设大家已经知道了锁的概念及其意义。调用sleep方法不会释放锁(自己的感觉是sleep方法本来就是和锁没有关系的,因为他是一个线程用于管理自己的方法,不涉及线程通信)


区别三:

使用区域

由于wait函数的特殊意义,所以他是应该放在同步语句块中的,这样才有意义 。因为wait 必须在 synchronized内部调用。

注意:两个方法都需要抛出异常

package com.test.sleepwait;public class MultiThread {    public static void main(String[] args){        new Thread(new Thread1()).start();        try {            Thread.sleep(5000);        } catch (Exception e) {            e.printStackTrace();        }        new Thread(new Thread2()).start();            }}class Thread1 implements Runnable{    @Override     public void run(){        synchronized(MultiThread.class){            System.out.println("Enter thread1...");            System.out.println("Thread1 is waiting...");                try{            MultiThread.class.wait();        }        catch (Exception e) {              e.printStackTrace();        }        System.out.println("thread1 is going on ....");        System.out.println("thread1 is over!!!");    }    }} class Thread2 implements Runnable{    @Override     public void run(){        synchronized(MultiThread.class){            System.out.println("Enter thread2...");            System.out.println("Threa2 is waiting...");                         MultiThread.class.notifyAll();        try{            Thread.sleep(5000);        }        catch (Exception e) {              e.printStackTrace();        }        System.out.println("thread2 is going on ....");        System.out.println("thread2 is over!!!");    }    }}


打印

Enter thread1...
Thread1 is waiting...
Enter thread2...
Threa2 is waiting...
thread2 is going on ....
thread2 is over!!!
thread1 is going on ....
thread1 is over!!!


同时要注意一点:

当一个线程进入一个对象的一个 synchronized 方法后,其它线程是否可进入此对象的其它方法?
分几种情况:
1. 其他方法前是否加了 synchronized 关键字,如果没加,则能。
2. 如果这个方法内部调用了 wait,则可以进入其他synchronized方法。
3. 如果其他个方法都加了 synchronized 关键字,并且内部没有调用 wait,则不能。

(因为 sleep方法没有释放锁,而wait释放了锁。原来Thread2遇到synchronized 语句时,由运行状态转为阻塞。 档Thread1中调用了wait,同时释放了锁,所以Thread2中的 synchronized块又重新获得锁,所以能进去了。





0 0
原创粉丝点击