多线程通讯实例(必须要有多个线程、必须要管理同一个变量;线程A生产一个变量,线程B消费一个变量)

package com.cppdy;

class User {

    public String username;
public String sex;
//如果flag为false 证明变量可写不可读
//如果flag为true 证明变量可读不可写
public boolean flag=false; } class InputThread extends Thread {
private User user; public InputThread(User user) {
this.user = user;
} @Override
public void run() {
int count = 0;
while (true) {
synchronized (user) { if(user.flag) {
try {
//这里是等待要去释放锁,线程会一直在这里等待,直到这个变量同一个user调用notify
user.wait();
} catch (Exception e) {
e.printStackTrace();
}
} if (count % 2 == 0) {
user.username = "cppdy";
user.sex = "nan";
} else {
user.username = "吹泡泡的魚";
user.sex = "男";
}
count++;
//将user标记变为可读
user.flag=true;
//释放user锁
user.notify();
}
}
}
} class OutThread extends Thread {
private User user; public OutThread(User user) {
this.user = user;
} @Override
public void run() {
while (true) {
synchronized (user) {
if(!user.flag) {
try {
user.wait();
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println(user.username + "--" + user.sex);
//将user标记变为可读
user.flag=false;
//释放user锁
user.notify();
}
}
}
} public class ThreadDemo13 { public static void main(String[] args) throws Exception {
User user = new User();
InputThread it = new InputThread(user);
OutThread ot = new OutThread(user);
it.start();
ot.start();
} }

生产者线程A:如果有值还没读,就等待

消费者线程B:如果全部读完了,就等待

java多线程快速入门(十七)的更多相关文章

  1. java 多线程 快速入门

    ------------恢复内容开始------------ java 多线程 快速入门 1. 进程和线程 什么是进程? 进程是正在运行的程序它是线程的集合 进程中一定有一个主线程 一个操作系统可以有 ...

  2. java多线程快速入门(六)

    多线程应用实例(批量发送短信) 1.创建实体类 package com.cppdy; public class UserEntity { private int id; private String ...

  3. java多线程快速入门(一)

    1.什么是进程 比如:QQ.QQ游戏.eclipse都是进程,可以通过任务管理器查看进程 2.进程和线程区别 线程是进程的一部分,一个进程可以包含多个线程,一个线程只能属于一个进程 进程是所有线程的集 ...

  4. java多线程快速入门(二十二)

    线程池的好处: 避免我们过多的去new线程,new是占资源的(GC主要堆内存) 提高效率 避免浪费资源 提高响应速度 作用:会把之前执行某个线程完毕的线程不会释放掉会留到线程池中给下一个调用的线程直接 ...

  5. java多线程快速入门(二十一)

    CountDownLatch(闭锁)计数器 有一个任务A,它要等待其他4个任务执行完毕之后才执行,此时就可以利用CountDownLatch来实现这种功能 package com.cppdy; imp ...

  6. java多线程快速入门(二十)

    1.Java.util的线程安全工具类 Vector(线程安全) ArrayList(线程不安全) HashTable(线程安全) HashMap(线程不安全) 2.将线程不安全集合变为线程安全集合 ...

  7. java多线程快速入门(十八)

    Lock锁是JDK1.5之后推出的并发包里面的关键字(注意捕获异常,释放锁) Lock与synchronized的区别 Lock锁可以人为的释放锁(相当于汽车中的手动挡) synchronized当线 ...

  8. java多线程快速入门(十五)

    使用violate关键字解决了变量的可见性问题(volatile让多线程刷新falg的值) package com.cppdy; class MyThread11 extends Thread { / ...

  9. java多线程快速入门(十四)

    使用atomicInteger解决了原子性问题(AtomicInteger保证每次只能一个线程操作count) package com.cppdy; import java.util.concurre ...

随机推荐

  1. org.apache.flume.conf.ConfigurationException: Channel c1 not in active set.

    1 错误详细信息 WARN conf.FlumeConfiguration: Could not configure sink k1 due to: Channel c1 not in active ...

  2. 「PKUWC 2018」Minimax

    传送门:Here 一道线段树合并好题 如果要维护点$ x$的信息,相当于合并$ x$的两棵子树 对于这题显然有:任何叶子节点的权值都可能出现在其祖先上 因而我们只需要在线段树合并的时候维护概率即可 我 ...

  3. Leetcode#709. To Lower Case(转换成小写字母)

    题目描述 实现函数 ToLowerCase(),该函数接收一个字符串参数 str,并将该字符串中的大写字母转换成小写字母,之后返回新的字符串. 示例 1: 输入: "Hello" ...

  4. DIY一些基于netty的开源框架

    几款基于netty的开源框架,有益于对netty的理解和学习! 基于netty的http server框架 https://github.com/TogetherOS/cicada 基于netty的即 ...

  5. django drf 基础学习1

    一 环境配置    python3.5+ django2.0 pymysql二 安装   /usr/bin/python3 -m pip install django   /usr/bin/pytho ...

  6. 使用Office Online Server在线预览Office

    微软官方文档介绍 ⒈介绍 Office Online Server是 Office Web Apps Server 的升级版本,安装环境必须为两台Windows Server 2012 R2 或 Wi ...

  7. 8.3版本提示未在本地计算机上注册 Microsoft.ACE.OLEDB.12.0 提供程序

    这个原因是8.3版本推出了64位程序,但是Access驱动在64位系统上默认是没有安装的,需要下载一个组件安装即可. 下载2010 Access 驱动程序:数据连接组件安装 http://www.ba ...

  8. HardNet解读

    论文:Working hard to know your neighbor’s margins: Local descriptor learning loss  为什么介绍此文:这篇2018cvpr文 ...

  9. 学习awk命令的使用

    作者:邓聪聪 awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息 awk处理过程: 依次对每一行进行处理,然后输出 awk命令形式: ...

  10. requests库入门03-get请求

    先看一个没有请求参数的get请求,访问百度首页 import requests r = requests.get('https://www.baidu.com') print(r.status_cod ...