java 线程通信
2017-02-09 22:12
288 查看
java 线程通信使用
wait notify 配合synchronized
当线程执行wait()时,会把当前的锁释放,然后让出CPU,进入等待状态。
当执行notify/notifyAll方法时,会唤醒一个处于等待该 对象锁 的线程,然后继续往下执行,直到执行完退出对象锁锁住的区域(synchronized修饰的代码块)后再释放锁。
如下代码:
运行的结果:
注意这里t2线程先执行,t1线程后执行。如果t1线程先执行那么t2获取不到lock,t1 notify的时候 通知不到t2。
这么做有点弊端:不能做到实时的通知,要想做到通知发出,另外一个线程马上收到通知,需要用到java.util.concurrent 的CountDownLatch
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面向对象之细谈线程、线程通信(下)
- JAVA5多线程---Condition使用---线程通信
- 黑马程序员——java基础拾遗之多线程(二) 线程同步、线程通信
- java中的线程通信
- Java 多线程(五)——线程通信(共享内存、管道流、wait()、notify()等)
- java的线程通信
- java 线程通信
- java中的线程通信
- java中的线程通信
- Java并发——线程安全、线程同步、线程通信
- java 线程通信
- Java学习系列(十五)Java面向对象之细谈线程、线程通信(下)
- java笔记--关于线程通信
- Java线程总结(3):线程通信
- 【黑马程序员】 java笔记——线程通信
- Java学习系列(十四)Java面向对象之细谈线程、线程通信(上)
- Java多线程(4)——线程通信
- Java复习--线程通信
- Java 管道 线程通信
- Java 线程通信