wait
wait是Object的方法,使得线程从运行态进入阻塞态
notifyAll
notifyAll也是Object方法,唤醒所有该对象的等待线程
代码测试
package com.javalearn.javalearn.concurrency.wait;
import lombok.extern.slf4j.Slf4j;
import static java.lang.Thread.sleep;
@Slf4j
public class NofityAllTest {
private static Object object = new Object();
public static void main(String[] args) {
Thread t1 =new ThreadOne();
Thread t2 =new ThreadOne();
Thread t3=new ThreadOne();
t1.start();
t2.start();
t3.start();
//让其他三个线程执行下去
try {
log.info("thread: {} sleep",Thread.currentThread().getName());
sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (object){
//noftify notifyAll的区别
//object.notify();
object.notifyAll();
}
}
static class ThreadOne extends Thread {
@Override
public void run() {
synchronized (object) {
log.info("thread: {} wait",Thread.currentThread().getName());
try {
object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info("thread: {} continue",Thread.currentThread().getName());
}
}
}
}
说明
主线程sleep之后,其他拥有object对象的线程进入运行态之后,依次进入阻塞态,主线程的obect在调用notifyAll唤醒拥有该对象的其他线程。
测试结果
11:40:16.276 [main] INFO com.javalearn.javalearn.concurrency.wait.NofityAllTest - thread: main sleep
11:40:16.279 [Thread-1] INFO com.javalearn.javalearn.concurrency.wait.NofityAllTest - thread: Thread-1 wait
11:40:16.285 [Thread-2] INFO com.javalearn.javalearn.concurrency.wait.NofityAllTest - thread: Thread-2 wait
11:40:16.285 [Thread-0] INFO com.javalearn.javalearn.concurrency.wait.NofityAllTest - thread: Thread-0 wait
11:40:19.285 [Thread-0] INFO com.javalearn.javalearn.concurrency.wait.NofityAllTest - thread: Thread-0 continue
11:40:19.285 [Thread-2] INFO com.javalearn.javalearn.concurrency.wait.NofityAllTest - thread: Thread-2 continue
11:40:19.285 [Thread-1] INFO com.javalearn.javalearn.concurrency.wait.NofityAllTest - thread: Thread-1 continue
Process finished with exit code 0