就是资源满了,他还想占用资源 就wait一下,等有资源了就会被notify,然后和所有wait的线程一起去抢资源
缺点:
1. 不能确保及时性
2. 难以降低开销
public class WaitNotify {
static boolean flag = true;
static Object lock = new Object();
public static void main(String[] args) throws Exception {
Thread waitThread = new Thread(new Wait(), "WaitThread");
waitThread.start();
TimeUnit.SECONDS.sleep(1);
Thread notifyThread = new Thread(new Notify() , "NotifyThread");
notifyThread.start();
}
static class Wait implements Runnable {
@Override
public void run() {
synchronized (lock) {
while (flag) {
try {
System.out.println(
Thread.currentThread()
+ " flag is true. wa @ "
+ new SimpleDateFormat("HH:mm:ss").format(new Date())
);
lock.wait();
} catch (InterruptedException e) {
}
}
System.out.println(
Thread.currentThread()
+ " flag is flase. runnint @"
+ new SimpleDateFormat("HH:mm:ss").format(new Date())
);
}
}
}
static class Notify implements Runnable {
@Override
public void run() {
synchronized (lock) {
System.out.println(
Thread.currentThread()
+ " hold lock. notify @ "
+ new SimpleDateFormat("HH:mm:ss").format(new Date())
);
lock.notifyAll();
flag = false;
SleepUtils.second(5);
}
synchronized (lock) {
System.out.println(
Thread.currentThread()
+ "hold lock again. sleep @"
+ new SimpleDateFormat("HH:mm:ss").format(new Date())
);
SleepUtils.second(5);
}
}
}
}
Thread.join
当a执行thread.join(),其含义是当前线程a等待thread线程终止后才从thread.join()返回
public class WaitNotify {
static boolean flag = true;
static Object lock = new Object();
public static void main(String[] args) throws Exception {
Thread waitThread = new Thread(new Wait(), "WaitThread");
waitThread.start();
TimeUnit.SECONDS.sleep(1);
Thread notifyThread = new Thread(new Notify() , "NotifyThread");
notifyThread.start();
}
static class Wait implements Runnable {
@Override
public void run() {
synchronized (lock) {
while (flag) {
try {
System.out.println(
Thread.currentThread()
+ " flag is true. wa @ "
+ new SimpleDateFormat("HH:mm:ss").format(new Date())
);
lock.wait();
} catch (InterruptedException e) {
}
}
System.out.println(
Thread.currentThread()
+ " flag is flase. runnint @"
+ new SimpleDateFormat("HH:mm:ss").format(new Date())
);
}
}
}
static class Notify implements Runnable {
@Override
public void run() {
synchronized (lock) {
System.out.println(
Thread.currentThread()
+ " hold lock. notify @ "
+ new SimpleDateFormat("HH:mm:ss").format(new Date())
);
lock.notifyAll();
flag = false;
SleepUtils.second(5);
}
synchronized (lock) {
System.out.println(
Thread.currentThread()
+ "hold lock again. sleep @"
+ new SimpleDateFormat("HH:mm:ss").format(new Date())
);
SleepUtils.second(5);
}
}
}
}