文章目录
1.1. wait / notify / notifyAll
Object.wait()/Object.notify()/Object.notifyAll()
可用于实现等待和通知。wait()
方法可以使其执行的线程被暂停,该方法用来实现等待。
wait()
方法,因此Object.wait()
总是放在相应对象所领导的临界区中,必须和synchronized
关键字进行使用notify()
用于唤醒一个被暂停的线程,调用该方法可以实现通知
wait()
方法一样的对象调用synchronized
关键字,并且在执行完毕之后会释放同步锁notifyAll()
用于唤醒当前对象中的全部等待线程public class TestThread {
public static void main(String[] args) throws InterruptedException {
MyThread thread=new MyThread();
new Thread(thread,"线程1").start();
Thread.sleep(2000);
thread.testNotifyAll();
}
}
class MyThread implements Runnable{
private final Object object=new Object(); //创建一个Object对象,用于线程同步锁和调用wait方法
private volatile boolean flag=true; //保护条件
private int count=0;
public void run() {
this.testWait();
}
//测试等待
public void testWait(){
//循环执行
while(true){
//必须和调用wait的方法是一个对象
synchronized (object) {
while(!this.flag){
try {
System.out.println(Thread.currentThread().getName()+" 等待被唤醒....");
object.wait();
} catch (InterruptedException e) {
System.out.println("线程被终止.....");
}
}
this.doAction(); //执行其他的动作
}
}
}
//测试唤醒线程,随机唤醒一个线程
public void testNotify(){
synchronized (object) {
this.flag=true;
//从当前object的等待线程中随机唤醒一个线程
object.notify();
}
}
//唤醒所有线程
public void testNotifyAll(){
synchronized (object) {
this.flag=true;
object.notifyAll(); //唤醒当前对象上的所有等待线程
}
}
//执行其他动作
public void doAction(){
System.out.println("执行其他的功能");
count++;
if (count==10) {
flag=false; //改变flag的值 ,将会wait
}
}
}
wait,notify()
思想一样,不过这个要和显示锁Lock
结合使用public class TestThread {
private static final Lock lock=new ReentrantLock(); //创建显示锁
private static final Condition condition=lock.newCondition(); //创建条件变量
private static volatile boolean flag=true; //保护条件
public static void main(String[] args) throws InterruptedException {
Thread thread1=new Thread(){
public void run() {
testWait();
};
};
thread1.start();
Thread thread2=new Thread(){
public void run() {
testSignal();
};
};
thread2.start();
}
public static void testWait(){
while(true){
lock.lock(); //获取显示锁
try {
if (!flag) {
condition.await();
}
doAction();
} catch (InterruptedException exception) {
exception.printStackTrace();
}finally{
lock.unlock(); //释放锁
}
}
}
public static void testSignal(){
while(true){
lock.lock(); //获取锁
try {
if (flag) {
System.out.println("执行其他的动作");
}else {
flag=true;
Thread.sleep(5000);
condition.signal(); //唤醒线程
}
} catch (Exception e) {
e.printStackTrace();
}finally{
lock.unlock();
}
}
}
public static void doAction(){
System.out.println("执行其他的动作");
flag=false; //改变flag
}
}