sleep方法和wait方法的区别:


1. sleep方法属于Thread类

wait方法属于Object类

2. sleep方法是线程用来控制自身流程的,使程序暂停执行指定的时间,让出cpu给其他线程,线程不会释放对象锁

wait方法释放了锁,使得其他线程可以使用同步控制块或者方法,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备

3. wait, notify和notifyAll只能在同步控制方法(synchronized)或者同步控制块里面使用

sleep可以在任何地方使用

4. sleep必须捕获异常

wait,notify和notifyAll不需要捕获异常


sleep方法:

sleep方法属于Thread类中方法,表示让一个线程进入睡眠状态,等待一定的时间之后,自动醒来进入到可运行状态,但它不会马上进入运行状态,因为其它线程可能正在运行而且没有被调度为放弃执行,除非(a)“醒来”的线程具有更高的优先级; (b)正在运行的线程因为其它原因而阻塞。 一个线程对象调用了sleep方法之后,并不会释放他所持有的所有对象锁,所以也就不会影响其他进程对象的运行。但在 sleep的过程中过程中有可能被其他对象调用它的interrupt(),产生InterruptedException异常,如果你的程序不捕获这个异常,线程就会异常终止,进入TERMINATED状态,如果你的程序捕获了这个异常,那么程序就会继续执行catch语句块(可能还有finally语句块)以及以后的代码。注意sleep()方法是一个静态方法,也就是说他只对当前对象有效,不能通过t.sleep()让t对象进入sleep。


wait方法:

wait属于Object的成员方法,一旦一个对象调用了wait方法,必须要采用notify()和notifyAll()方法唤醒该进程。如果线程拥有某个或某些对象的同步锁,那么在调用了wait()后,这个线程就会释放它持有的所有同步资源,而不限于这个被调用了wait()方法的对象。从而使线程所在对象中的其它synchronized数据可被别的线程使用。 wait()方法也同样会在wait的过程中有可能被其他对象调用interrupt()方法而产生InterruptedException,效果以及处理方式同sleep()方法。

/**
 * Created by tcgogogo on 16/8/5.
 */
public class Test {
    private static class T1 implements Runnable {

        @Override
        public void run() {
            synchronized (Test.class) {   //反射机制,给当前类加锁
                System.out.println("enter thread1");
                try {
                    System.out.println("thread1 waiting");
                    Test.class.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("thread1 end");
            }
        }
    }

    private static class T2 implements Runnable {

        @Override
        public void run() {
            synchronized (Test.class) {
                System.out.println("enter thread2");
                try {
                    Test.class.notify();
                    System.out.println("thread2 waiting");
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("thread2 end");
            }
        }
    }

    public static void main(String[] args) {
        new Thread(new T1()).start();
        new Thread(new T2()).start();
    }
}

以上程序执行结果为

enter thread1
thread1 waiting
enter thread2
thread2 waiting
thread2 end
thread1 end




若将Test.class.notify()注释运行结果为

enter thread1
thread1 waiting
enter thread2
thread2 waiting
thread2 end

可见当调用wait方法后线程1被挂起,锁被撤回且必须要通过notify唤醒才能再次获得锁,而sleep方法被调用后线程暂定3秒钟继续执行