本模式以一个经典练习为案例:
要求
1.自定义容器,提供新增元素(add)和获取元素数量(size)方法。
2.启动两个线程。线程1向容器中新增10个数据。线程2监听容器元素数量,当容器元素数量为5时,线程2输出信息并终止。
案例分析:
上代码:
/**
* wait notify
*/
package concurrent.t02;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class Test_02 {
public static void main(String[] args) {
final Test_02_Container t = new Test_02_Container();
final Object lock = new Object();
new Thread(new Runnable(){
@Override
public void run() {
synchronized (lock) {
if(t.size() != 5){
try {
lock.wait(); // 线程进入等待队列。(wait会释放当前锁资源)
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("size = 5");
lock.notifyAll(); // 唤醒其他等待线程
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
synchronized (lock) {
for(int i = 0; i < 10; i++){
System.out.println("add Object to Container " + i);
t.add(new Object());
if(t.size() == 5){
lock.notifyAll();
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}).start();
}
}
class Test_02_Container{
List<Object> container = new ArrayList<>();
public void add(Object o){
this.container.add(o);
}
public int size(){
return this.container.size();
}
}
以上仅是博主学习自己写的例子,可能在一些情况下考虑的不周到,还请指教!