在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));
}*/
}
}