java 线程通信

Posted Lenny

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 线程通信相关的知识,希望对你有一定的参考价值。

java 线程通信使用
wait notify 配合synchronized 
当线程执行wait()时,会把当前的锁释放,然后让出CPU,进入等待状态。
当执行notify/notifyAll方法时,会唤醒一个处于等待该 对象锁 的线程,然后继续往下执行,直到执行完退出对象锁锁住的区域(synchronized修饰的代码块)后再释放锁。

如下代码:

public class ThreadTest {

//声明一个线程可视化的list集合
public static List<String> list = new ArrayList<>();

public static void main(String[] args) {
Object lock = new Object();

Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (lock) {
for (int i = 0; i < 10; i++) {
list.add("lenny");
System.out.println(Thread.currentThread().getName() + "往list增加了新项目");
if (list.size() == 5) {
lock.notify(); //通知lock挂起的线程 继续执行 synchronized 块代码 执行完成后 释放锁
System.out.println("当前线程:" + Thread.currentThread().getName() + ",已经发出通知");
}
}
}
}
}, "t1");

Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (lock) {
if (list.size() != 5) {
try {
lock.wait(); //此处线程挂起 释放lock
System.out.println("list长度"+list.size());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("当前线程:" + Thread.currentThread().getName() + ",收到通知");
}
}
}, "t2");

t2.start();
t1.start();
}
}

运行的结果:

 注意这里t2线程先执行,t1线程后执行。如果t1线程先执行那么t2获取不到lock,t1 notify的时候 通知不到t2。

 这么做有点弊端:不能做到实时的通知,要想做到通知发出,另外一个线程马上收到通知,需要用到java.util.concurrent 的CountDownLatch

以上是关于java 线程通信的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程:线程间通信方式

多个请求是多线程吗

java 线程通信

java多线程(线程通信-等待换新机制-代码优化)

Java并发编程之线程安全线程通信

Java多线程与并发库4.传统线程同步通信技术