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:
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)); }*/ } }
相关文章推荐
- java线程同步原理及wait,notify的用法及与sleep的区别
- java线程 sleep()和wait()的区别
- java线程的sleep(),wait(),notify(),yield()方法的区别要点
- java线程中wait()和sleep()区别
- java线程的sleep(),wait(),notify(),yield()方法的区别要点
- Java线程中sleep()、wait()和notify()和notifyAll()、suspend和resume()、yield()、join()、interrupt()的用法和区别
- 线程中wait与sleep的区别以及stop和interrupt的区别
- Java线程中sleep()、wait()和notify()和notifyAll()、yield()、join()等方法的用法和区别
- 线程的yield(),sleep()以及wait()的区别
- Java Thread(线程)案例详解sleep和wait的区别
- 线程的yield(),sleep()以及wait()的区别
- 线程中sleep和wait有什么区别
- java线程中yield(),sleep(),wait()区别详解
- Java线程中sleep和wait的区别
- 线程wait()和sleep()的区别
- Java线程中sleep和wait的区别
- java线程的sleep(),wait(),notify(),yield()方法的区别要点
- Java线程中sleep和wait的区别详细介绍
- java线程wait与sleep的区别
- java线程同步原理及wait,notify的用法及与sleep的区别