您的位置:首页 > 大数据 > 人工智能

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

2017-06-26 00:30 183 查看
在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));
}*/
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: