博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
010 线程通信
阅读量:5032 次
发布时间:2019-06-12

本文共 1944 字,大约阅读时间需要 6 分钟。

一 . 概念

  我们使用多个线程的时候,我们需要线程运行之间按照一定的顺序运行下去,这个就需要线程之间的通信.


 

二 .例子

  我们使用经典的生产者和消费者模式演示一下.

public class ProductAndConsume {    private static Object lock = new Object();    private volatile static int count = 0;    private static volatile boolean flag = false;    public static void product()  {            synchronized (lock) {                try {                    Thread.sleep(100);                } catch (InterruptedException e1) {                    e1.printStackTrace();                }                if (!flag) {                    System.out.println("我生产了第" + (++count) + "个产品");                    try {                        //放入等待池中                        flag = true ;                         lock.wait();                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                }            }    }    public static void consume() {            synchronized (lock) {                try {                    Thread.sleep(100);                } catch (InterruptedException e1) {                    e1.printStackTrace();                }                if (flag) { // 有产品                    System.out.println("我消费了第" + count + "个产品");                    flag = false;                    lock.notify();                 }             }    }    public static void main(String[] args) {        new Thread("product") {            @Override            public void run() {                for(;;)                product();            };        }.start();        new Thread("consume") {            @Override            public void run() {                for(;;)                consume();            };        }.start();    }}

我们创建了两个线程,一个生产产品,另外一个线程消费产品.

我们使用了wait()方法和notify()方法发送信号量,实现线程之间的同步.


三 .分析

[1]首先需要说明的就是我们的wait和notify都需要在同步代码块(同步方法之中运行).

[2]wait()方法的含义是:

    放弃当前持有的锁,,进入到锁池中,等待被唤醒.

[3]notify()方法的含义是:

    在当前的锁池中唤醒一个线程.

 

转载于:https://www.cnblogs.com/trekxu/p/8971288.html

你可能感兴趣的文章
Jmeter性能测试 入门
查看>>
ssh 连接原理及ssh-keygen
查看>>
vs2013编译qt程序后中文出现乱码
查看>>
【转】IOS数据库操作SQLite3使用详解
查看>>
Android官方技术文档翻译——ApplicationId 与 PackageName
查看>>
【转】ButterKnife基本使用--不错
查看>>
【转】VS2012编译出来的程序,在XP上运行,出现“.exe 不是有效的 win32 应用程序” “not a valid win32 application”...
查看>>
函数中关于const关键字使用的注意事项
查看>>
js随机数的取整
查看>>
Feign使用Hystrix无效原因及解决方法
查看>>
golang 的编译安装以及supervisord部署
查看>>
Eclipse导入maven项目时,Pom.xml文件报错处理方法
查看>>
01、JAVA开发准备
查看>>
抽象工厂模式(Abstract Factory)
查看>>
luogu1373 小a和uim之大逃离 (dp)
查看>>
Redis的Pub/Sub客户端实现
查看>>
springMVC入门(一)------springMVC基本概念与安装
查看>>
Sam做题记录
查看>>
[bzoj] 2453 维护数列 || 单点修改分块
查看>>
IIS版本变迁
查看>>