java通过代码控制线程状态,解决线程不安全的问题。
写两个类,Input,output
两个都是使用同步代码块的方式实现线程间的同步
input类,是为变量赋值
output类,是打印变量
由于线程争夺cpu造成数据的不匹配
通过,设立一个 flag 标志位,当flag=true的时候当前赋值等待,等待打印结束完成,唤醒赋值线程,flag=flase 打印值等待,等待赋值线程完成赋值,唤醒打印线程
- package demo04;
- /*
- * 定义资源类,有2个成员变量
- * name,sex
- * 同时有2个线程,对资源中 的变量操作
- * 1个对name,age赋值
- * 2个对name,age做变量的输出da'yin
- */
- public class Resource {
- public String name;
- public String sex;
- public boolean flag;
- }
- package demo04;
- /*
- * 输入的线程,对资源对象Resource中成员变量赋值
- * 一次赋值张三,男
- * 下一次赋值lisi,女
- */
- public class Input implements Runnable {
- private Resource r ;
- public Input(Resource r){
- this.r = r;
- }
- public void run() {
- int i = 0 ;
- while(true){
- synchronized(r){
- //标记是true,等待
- if(r.flag){
- try{r.wait();}catch(Exception ex){}
- }
- if(i%2==0){
- r.name = "张三";
- r.sex = "男";
- }else{
- r.name = "lisi";
- r.sex = "nv";
- }
- //将对方线程唤醒,标记改为true
- r.flag = true;
- r.notify();
- }
- i++;
- }
- }
- }
- package demo04;
- /*
- * 输出线程,对资源对象Resource中成员变量,输出值
- */
- public class Output implements Runnable {
- private Resource r ;
- public Output(Resource r){
- this.r = r;
- }
- public void run() {
- while(true){
- synchronized(r){
- //判断标记,是false,等待
- if(!r.flag){
- try{r.wait();}catch(Exception ex){}
- }
- System.out.println(r.name+".."+r.sex);
- //标记改成false,唤醒对方线程
- r.flag = false;
- r.notify();
- }
- }
- }
- }
- package demo04;
- /*
- * 开启输入线程和输出线程,实现赋值和打印值
- */
- public class ThreadDemo{
- public static void main(String[] args) {
- Resource r = new Resource();
- Input in = new Input(r);
- Output out = new Output(r);
- Thread tin = new Thread(in);
- Thread tout = new Thread(out);
- tin.start();
- tout.start();
- }
- }
java通过代码控制线程状态,解决线程不安全的问题。的更多相关文章
- Java线程状态、线程start方法源码、多线程、Java线程池、如何停止一个线程
下面将依次介绍: 1. 线程状态.Java线程状态和线程池状态 2. start方法源码 3. 什么是线程池? 4. 线程池的工作原理和使用线程池的好处 5. ThreadPoolExecutor中的 ...
- 【Java多线程】线程状态、线程池状态
线程状态: 线程共包括以下5种状态.1. 新建状态(New) 线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread().2. 就绪状态(Runnable) 也 ...
- Java多线程编程(七)线程状态、线程组与异常处理
一.线程的状态 线程对象在不同的运行时期有不同的状态,状态信息就存在于State枚举类中. 调用与线程有关的方法后,会进入不同的线程状态,这些状态之间某些是可双向切换的,比如WAITING和RUNNI ...
- Java线程状态Jstack线程状态BLOCKED/TIMED_WAITING/WAITING解释
一.线程5种状态 新建状态(New) 新创建了一个线程对象. 就绪状态(Runnable) 线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中,变得可运行,等待获 ...
- Java线程状态流转---线程
说明:线程共包括以下5种状态.1. 新建状态(New) : 线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread().2. 就绪状态(Runn ...
- 2.2多线程(java学习笔记)线程状态及线程操作的相关方法
一.线程的状态 线程一般具有五种状态,即创建.就绪.运行.阻塞.终止. 它们之间的关系: 二.线程操作相关方法 1.设置和取得线程名称. 如果不设置线程名称,系统会自动分配线程名,一般格式为Threa ...
- Java内存泄漏分析系列之四:jstack生成的Thread Dump日志线程状态
原文地址:http://www.javatang.com Thread Dump日志的线程信息 以下面的日志为例: "resin-22129" daemon prio=10 tid ...
- 面试官:都说阻塞 I/O 模型将会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?
摘要: 原创出处 https://studyidea.cn 「公众号:程序通事 」欢迎关注和转载,保留摘要,谢谢! 使用 Java 阻塞 I/O 模型读取数据,将会导致线程阻塞,线程将会进入休眠,从而 ...
- 一文读懂Java线程状态转换
前言 本文描述Java线程线程状态及状态转换,不会涉及过多理论,主要以代码示例说明线程状态如何转换. 基础知识 1. 线程状态 Thread源码中的状态说明: 线程可以有6种状态: New(新建) R ...
随机推荐
- NOIP计划索引
药丸的节奏 亟待解决的问题 灵光一现的trick 2018上学期刷题记录 NOIP2018 - 暑期博客整理 NOIP2018 - 一些板子 NOIP2018 - 每日填坑
- ubuntu系统普通用户密码忘记之重置
当我们在使用ubuntu系统忘记普通用户登录密码的时候,会被系统在登录界面拒之门外而不得入,这时候只好需要我们去重新设置密码,具体做法如下: 系统重启,在GRUB模式下选择Advanced Optio ...
- pycharm安装 suds模块报错:AttributeError: module 'pip' has no attribute 'main'
需求:安装suds模块 遇到的问题: 一.报错信息:[file][Default Settint]---Project Interpreter 点击 搜索suds安装模块报错 解决:依据上图提示找到C ...
- DELL PowerEdge R620安装Windows server(你想将windows安装在何处”找不到任何本地磁盘,“找不到驱动器”)已解决!
你可能碰到过DELL服务器上安装Windows server系列系统时无法识别或找不到硬盘的问题,对于DELL PowerEdge11-14代机器的,大家可以采用DELL的Lifecycle cont ...
- CentOS7的systemctl使用
CentOS 7开始,CentOS开始使用systemd服务来代替daemon,原来管理系统启动和管理系统服务的相关命令全部由systemctl命令来代替. 1.原来的 service 命令与 sys ...
- Linux 用户管理(三)
一.userdel --delete a user account and related files -r --remove 删除用户及家目录 二.id --print real and effe ...
- PyCharm2019 激活方式
1.修改hosts激活:需要修改hosts,稳定无影响,持续更新,推荐~ 一.修改hosts激活 1.修改hosts文件 将0.0.0.0 account.jetbrains.com和0.0.0.0 ...
- hdu 4565
Problem Description A sequence Sn is defined as:Where a, b, n, m are positive integers.┌x┐is the cei ...
- jmeter switch controller
工作方式: Switch控制器通过给该控制器中的Value赋值,来指定运行哪个采样器.有两种赋值方式: 1.第一种是数值,Switch控制器下的子节点从0开始计数,通过指定子节点所在的数值来确定执行哪 ...
- ADB命令后台修改系统默认输入法
今天要研究uiautomator如何输入中文,看网上有一种常用的解决办法:http://www.cnblogs.com/yajing-zh/p/5125387.html在这篇博客最后提出来的问题,也是 ...