java多线程快速入门(十七)
多线程通讯实例(必须要有多个线程、必须要管理同一个变量;线程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多线程快速入门(十七)的更多相关文章
- java 多线程 快速入门
------------恢复内容开始------------ java 多线程 快速入门 1. 进程和线程 什么是进程? 进程是正在运行的程序它是线程的集合 进程中一定有一个主线程 一个操作系统可以有 ...
- java多线程快速入门(六)
多线程应用实例(批量发送短信) 1.创建实体类 package com.cppdy; public class UserEntity { private int id; private String ...
- java多线程快速入门(一)
1.什么是进程 比如:QQ.QQ游戏.eclipse都是进程,可以通过任务管理器查看进程 2.进程和线程区别 线程是进程的一部分,一个进程可以包含多个线程,一个线程只能属于一个进程 进程是所有线程的集 ...
- java多线程快速入门(二十二)
线程池的好处: 避免我们过多的去new线程,new是占资源的(GC主要堆内存) 提高效率 避免浪费资源 提高响应速度 作用:会把之前执行某个线程完毕的线程不会释放掉会留到线程池中给下一个调用的线程直接 ...
- java多线程快速入门(二十一)
CountDownLatch(闭锁)计数器 有一个任务A,它要等待其他4个任务执行完毕之后才执行,此时就可以利用CountDownLatch来实现这种功能 package com.cppdy; imp ...
- java多线程快速入门(二十)
1.Java.util的线程安全工具类 Vector(线程安全) ArrayList(线程不安全) HashTable(线程安全) HashMap(线程不安全) 2.将线程不安全集合变为线程安全集合 ...
- java多线程快速入门(十八)
Lock锁是JDK1.5之后推出的并发包里面的关键字(注意捕获异常,释放锁) Lock与synchronized的区别 Lock锁可以人为的释放锁(相当于汽车中的手动挡) synchronized当线 ...
- java多线程快速入门(十五)
使用violate关键字解决了变量的可见性问题(volatile让多线程刷新falg的值) package com.cppdy; class MyThread11 extends Thread { / ...
- java多线程快速入门(十四)
使用atomicInteger解决了原子性问题(AtomicInteger保证每次只能一个线程操作count) package com.cppdy; import java.util.concurre ...
随机推荐
- CSS面试复习(一):HTML强化
1. HTML常见元素和理解 head类 meta:字符集.base:路径. a[href,target] img[src,alt] table td[colspan,rowspan] form[ta ...
- 自定义函数hello,并注册到hive源码中并重新编译
1 编写自己的udf方法hello package cn.zhangjin.hive.udf; import org.apache.hadoop.hive.ql.exec.Description; i ...
- Java中使用到的锁
同一进程 重入锁 使用ReentrantLock获取锁的时候回判断当前线程是否为获取锁的线程,如果是则将同步的状态+1,释放锁的时候则将状态-1,只有将同步状态的次数置为0的时候才会是最终释放锁. 读 ...
- Ant使用指南
ant 使用指南 参考:http://www.cnblogs.com/hoojo/archive/2013/06/14/java_ant_project_target_task_run.html 一 ...
- JQ中的 offsetTop 和 offset().top 的区别
话不多说先上图: offset()的top是指元素与document的上边的距离,而不是浏览器当前窗体的上边缘,如图 document高度超过window,浏览器出现滚动条,滚动滚动条,提交按钮的of ...
- 【blog】SpringBoot如何搭建聚合项目
以我的博客为例 blog --blog-common --blog-entity --blog-repo --blog-service --blog-web SpringBoot聚合项目推荐 http ...
- shiro--认证部分
1.1 什么是shiro shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证.用户授权. spring中有spring security (原名Acegi),是一个权限框架, ...
- MySql cmd下的学习笔记 —— 有关多表查询的操作(多表查询练习题及union操作)
先建立一张 m 表 mysql> create table m ( -> mid int, -> hid int, -> gid int, ), -> matime da ...
- Django中的csrf基础了解
简介 django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成.而对于django中设置防跨站请求伪造功能有 ...
- python第二天,list和tuple
概念:list是集合,且是可变集合,tuple是元组集合,不可变集合. 1.Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 主要知识点:初始化 ...