zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    LINQ语法详解
    win7下安装IIS7
    jquery ajax跨域请求webservice webconfig配置
    ServiceStack.Hello——跨平台.net REST api服务搭建
    使用ServiceStack构建Web服务
    VS2010插件之NuGet
    jQuery调用WCF
    它在 ServiceHost 指令中提供为 Service 特性值,或在配置元素 system.serviceModel/serviceHostingEnvironment/serviceActivations 中提供
    WCF Service Configuration Editor的使用
    jQuery验证控件jquery.validate.js使用说明+中文API
  • 原文地址:https://www.cnblogs.com/nele/p/6384429.html
Copyright © 2011-2022 走看看