多线程通信wait与notify
线程通信概念:线程是操作系统中独立的个体,但是这些个体如果不经过特殊的处理就不能成为一个整体,线程间的通信就成为整体的方式之一。
使用wait/notify方法实现线程间的通信。(这两个方法都是object的方法,也就是说只要是object的子类,都会提供这样的方法),wait方法是释放锁的,但是notify是不会释放锁的。
如下:
import java.util.ArrayList;
import java.util.List;
public class Test1 extends Thread{
private volatile List list = new ArrayList<>();
private void add(Object obj)
{
list.add(obj);
}
private int getSize()
{
return list.size();
}
public static void main(String[] args) {
final Test1 test1 = new Test1();
final Object object = new Object();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (object) {
try {
for (int i = 0; i < 10; i++) {
test1.add(i);
System.out.println("线程:"+Thread.currentThread().getName()+"进入");
if(test1.getSize()==5)
{
object.notify();
System.out.println("进入到了为5的判断");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
},"t1");
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (object) {
try {
if(test1.getSize()!=5)
{
object.wait();
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("运行结束");
}
}
},"t2");
t2.start();
t1.start();
}
}
输出的结果为:
线程:t1进入
线程:t1进入
线程:t1进入
线程:t1进入
线程:t1进入
进入到了为5的判断
线程:t1进入
线程:t1进入
线程:t1进入
线程:t1进入
线程:t1进入
运行结束
如果将上述的运行顺序换为:t1先执行的话,那么运行的结果为:
线程:t1进入
线程:t1进入
线程:t1进入
线程:t1进入
线程:t1进入
进入到了为5的判断
线程:t1进入
线程:t1进入
线程:t1进入
线程:t1进入
线程:t1进入
原因:因为wait是会释放锁的,但是notify是不会释放锁的。