1.需求:当list的长度不等于5时,开始等待wait,当等于5时,唤醒
2.代码
2.1定义waitdemo类
/**
* 线程通信
*/
public class WaitDemo {
static List<String> list = new ArrayList<String>();
public static void add(){
list.add("anything");
}
public static int size(){
return list.size();
}
}
2.2定义threada类
public class ThreadA implements Runnable {
private Object obj;
public ThreadA(Object obj) {
super();
this.obj = obj;
}
@Override
public void run() {
synchronized (obj) {
if(WaitDemo.size()!=5){
System.out.println("wait begin"+System.currentTimeMillis());
try {
obj.wait();
System.out.println("wait end"+System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
2.3定义threadb类
public class ThreadB implements Runnable {
private Object obj;
public ThreadB(Object obj) {
super();
this.obj = obj;
}
@Override
public void run() {
synchronized (obj) {
for(int i=0;i<10;i++){
WaitDemo.add();
if(WaitDemo.size()==5){
obj.notify();
System.out.println("已经发出通知了");
}
System.out.println("添加了"+(i+1)+"个元素");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
2.4测试
public class Test {
public static void main(String[] args) throws InterruptedException {
Object obj = new Object();
ThreadA threadA = new ThreadA(obj);
ThreadB threadB = new ThreadB(obj);
Thread thread1 = new Thread(threadA);
Thread thread2 = new Thread(threadB);
thread1.start();
Thread.sleep(1000);
thread2.start();
}
}
2.5输出结果
wait begin1525533680484
添加了1个元素
添加了2个元素
添加了3个元素
添加了4个元素
已经发出通知了
添加了5个元素
添加了6个元素
添加了7个元素
添加了8个元素
添加了9个元素
添加了10个元素
wait end1525533691268
总结和练习,是最好的方法,时间长不用就开始忘