wait()和线程的sleep()的区别

来源:互联网 发布:女神很少网络 编辑:程序博客网 时间:2024/06/05 20:47

在Java.lang.Thread类中,提供了sleep(),而java.lang.Object类中提供了wait(), notify()和notifyAll()方法来操作线程

 

sleep()可以将一个线程睡眠,参数可以指定一个时间。

wait()可以将一个线程挂起,直到超时或者该线程被唤醒。

   

sleep和wait的区别有:

    1)这两个方法来自不同的类分别是Thread和Object

    2)最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。

    3)wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用

               synchronized(x){

                         x.notify()

                       //或者wait()

               }

    4)sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

 

synchronized代码被执行期间,线程可以调用对象的wait()方法,释放对象锁标志,进入等待状态。

notify()通知等待队列中的第一个线程,notifyAll()通知的是等待队列中的所有线程

 
要理解await()、notify()、notifyAll()请看demo
package utils.http.httpclient;import org.apache.commons.collections.bag.SynchronizedBag;import java.util.ArrayList;import java.util.List;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;class Task implements Runnable{    private int x;            //线程编号    Lock lock;    CountDownLatch latch;    public Task(int x ,Lock lock, CountDownLatch latch) {        this.x = x;        this.lock = lock;        this.latch = latch;    }    public void run() {        latch.countDown();        synchronized (lock){            try {                lock.wait();            } catch (InterruptedException e) {            }        }        System.out.println(x + " thread doing something!");        System.out.println("第" + x + "个线程执行完毕");    }}class Lock{    public synchronized  void notifyOne(){        this.notify();    }    public synchronized  void notifyEveryOne(){        this.notifyAll();    }}public class ThreadPoolTest{    public static void main(String[] args) throws InterruptedException {        Lock lock = new Lock();        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(                5, 5,                1, TimeUnit.SECONDS,                new ArrayBlockingQueue<Runnable>(10, false),                new ThreadPoolExecutor.CallerRunsPolicy()        );        CountDownLatch latch = new CountDownLatch(5);        for (int i = 1; i <= 5; i++) {            threadPool.execute(new Task(i, lock, latch));        }        latch.await();        lock.notifyEveryOne();        threadPool.shutdown();        /*for (int i = 6; i <= 10; i++) {            threadPool.execute(new Task(i));        }*/    }}

原创粉丝点击