关于Java线程通信(初级)
来源:互联网 发布:python 开源题库系统 编辑:程序博客网 时间:2024/06/06 00:05
该Demo模仿插入和取出栈顶的数据
- 变量的声明
private int top = -1; // 栈顶 private int[] mData = new int[1024];// 存储数据的数组 private boolean isAlive = false; // 此时栈顶是否有数据
- 取出栈顶数据
当执行查询操作时查看标志位(栈顶是否有数据)
假设结果为true那么取出数据并重置标志位,否则wait。
public int pop() { synchronized (this) { while (!isAlive) { try { System.out.println("释放对象锁-->pop"); wait(); } catch (InterruptedException e) { System.out.println(e.getMessage()); } } System.out.println("被唤起-->pop"); isAlive = false;// 设置标志位为false int i = mData[top--]; notifyAll();// 唤醒此时正在等待压入数据的线程 return i; } }
- 向栈顶插入数据
当执行查询操作时查看标志位(栈顶是否有数据)
假设结果为false那么插入数据并重置标志位,否则wait。
public void push(int i) { synchronized (this) { System.out.println("拿到对象锁-->push"); while (isAlive) { try { System.out.println("释放对象锁-->push"); wait(); } catch (InterruptedException e) { System.out.println(e.getMessage()); } } System.out.println("压入数据-->push"); mData[++top] = i; isAlive = true;// 设置标志位为true notifyAll();// 唤醒此时正在等待取出栈顶数据的现成 } }
测试类长这样
public class Test { public static void main(String[] args) { final Stack stack = new Stack(); Thread thread = new Thread() { @Override public void run() { System.out.println(stack.pop() + ""); } }; thread.start(); Thread thread2 = new Thread() { @Override public void run() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } stack.push(1); } }; thread2.start(); }}
运行结果
拿到对象锁-->pop释放对象锁-->pop拿到对象锁-->push压入数据-->push被唤起-->pop1
流程如下
- 线程A拿到线程锁–>查看标志位–>结果为false–>进入wait释放掉线程锁–>线程B拿到线程锁–>查看标志位–>结果为flase–>反转为true–>插入数据–>重置标志位–>唤醒线程A–>线程A重新检查标志位状态–>假设此时标志位true–>取出数据重置标志位–>唤醒正在等待的线程
阅读全文
0 0
- 关于Java线程通信(初级)
- java的并发(初级-线程)
- JAVA中关于线程通信安全问题
- 在Java中,关于线程的通信
- Java线程通信(二)
- 干货!(Java)线程通信
- 【Android 初学】11、关于Android当中的线程(初级)
- Java线程总结(3):线程通信
- JAVA 线程 之 初级线程安全
- java IO 管道流 关于两个线程通信的问题
- 关于指针(初级)
- JAVA线程-线程间通信
- Java学习笔记(线程间通信)
- 线程通信,生产者消费者问题(Java)
- (6)Java之多线程通信
- JAVA线程间通信(生产者消费者)
- [Java]线程间协作(通信)
- java多线程(三)线程间通信
- openwrt系统初始化分析
- Spring task
- LeetCode-537. Complex Number Multiplication
- Linux下防火墙开启相关端口及查看已开启端口
- 使用iServer REST API发布工作空间(Java)
- 关于Java线程通信(初级)
- CentOS 7 添加中文输入法
- [Codeforces 809E] Surprise me! 莫比乌斯反演+虚树
- Android ROM中Odex文件的作用及介绍
- Java 多线程同步和异步详解
- 使用with关键字让你的Python代码更加Pythonic
- 通过Postman调试SpringMVC时出现日期转换错误的解决方案
- PHPExcel 导出2003和2007的excel文档实例
- 7.翻转整数