写两个类,Input,output

两个都是使用同步代码块的方式实现线程间的同步

input类,是为变量赋值

output类,是打印变量

由于线程争夺cpu造成数据的不匹配

通过,设立一个 flag 标志位,当flag=true的时候当前赋值等待,等待打印结束完成,唤醒赋值线程,flag=flase 打印值等待,等待赋值线程完成赋值,唤醒打印线程

  1. package demo04;
  2. /*
  3. * 定义资源类,有2个成员变量
  4. * name,sex
  5. * 同时有2个线程,对资源中 的变量操作
  6. * 1个对name,age赋值
  7. * 2个对name,age做变量的输出da'yin
  8. */
  9. public class Resource {
  10. public String name;
  11. public String sex;
  12. public boolean flag;
  13. }
  1. package demo04;
  2. /*
  3. * 输入的线程,对资源对象Resource中成员变量赋值
  4. * 一次赋值张三,男
  5. * 下一次赋值lisi,女
  6. */
  7. public class Input implements Runnable {
  8. private Resource r ;
  9.  
  10. public Input(Resource r){
  11. this.r = r;
  12. }
  13.  
  14. public void run() {
  15. int i = 0 ;
  16. while(true){
  17. synchronized(r){
  18. //标记是true,等待
  19. if(r.flag){
  20. try{r.wait();}catch(Exception ex){}
  21. }
  22.  
  23. if(i%2==0){
  24. r.name = "张三";
  25. r.sex = "男";
  26. }else{
  27. r.name = "lisi";
  28. r.sex = "nv";
  29. }
  30. //将对方线程唤醒,标记改为true
  31. r.flag = true;
  32. r.notify();
  33. }
  34. i++;
  35. }
  36. }
  37.  
  38. }
  1. package demo04;
  2. /*
  3. * 输出线程,对资源对象Resource中成员变量,输出值
  4. */
  5. public class Output implements Runnable {
  6. private Resource r ;
  7.  
  8. public Output(Resource r){
  9. this.r = r;
  10. }
  11. public void run() {
  12. while(true){
  13. synchronized(r){
  14. //判断标记,是false,等待
  15. if(!r.flag){
  16. try{r.wait();}catch(Exception ex){}
  17. }
  18. System.out.println(r.name+".."+r.sex);
  19. //标记改成false,唤醒对方线程
  20. r.flag = false;
  21. r.notify();
  22. }
  23. }
  24. }
  25.  
  26. }
  1. package demo04;
  2. /*
  3. * 开启输入线程和输出线程,实现赋值和打印值
  4. */
  5. public class ThreadDemo{
  6. public static void main(String[] args) {
  7.  
  8. Resource r = new Resource();
  9.  
  10. Input in = new Input(r);
  11. Output out = new Output(r);
  12.  
  13. Thread tin = new Thread(in);
  14. Thread tout = new Thread(out);
  15.  
  16. tin.start();
  17. tout.start();
  18. }
  19. }

java通过代码控制线程状态,解决线程不安全的问题。的更多相关文章

  1. Java线程状态、线程start方法源码、多线程、Java线程池、如何停止一个线程

    下面将依次介绍: 1. 线程状态.Java线程状态和线程池状态 2. start方法源码 3. 什么是线程池? 4. 线程池的工作原理和使用线程池的好处 5. ThreadPoolExecutor中的 ...

  2. 【Java多线程】线程状态、线程池状态

    线程状态: 线程共包括以下5种状态.1. 新建状态(New) 线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread().2. 就绪状态(Runnable) 也 ...

  3. Java多线程编程(七)线程状态、线程组与异常处理

    一.线程的状态 线程对象在不同的运行时期有不同的状态,状态信息就存在于State枚举类中. 调用与线程有关的方法后,会进入不同的线程状态,这些状态之间某些是可双向切换的,比如WAITING和RUNNI ...

  4. Java线程状态Jstack线程状态BLOCKED/TIMED_WAITING/WAITING解释

    一.线程5种状态 新建状态(New) 新创建了一个线程对象. 就绪状态(Runnable) 线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中,变得可运行,等待获 ...

  5. Java线程状态流转---线程

    说明:线程共包括以下5种状态.1. 新建状态(New)         : 线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread().2. 就绪状态(Runn ...

  6. 2.2多线程(java学习笔记)线程状态及线程操作的相关方法

    一.线程的状态 线程一般具有五种状态,即创建.就绪.运行.阻塞.终止. 它们之间的关系: 二.线程操作相关方法 1.设置和取得线程名称. 如果不设置线程名称,系统会自动分配线程名,一般格式为Threa ...

  7. Java内存泄漏分析系列之四:jstack生成的Thread Dump日志线程状态

    原文地址:http://www.javatang.com Thread Dump日志的线程信息 以下面的日志为例: "resin-22129" daemon prio=10 tid ...

  8. 面试官:都说阻塞 I/O 模型将会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?

    摘要: 原创出处 https://studyidea.cn 「公众号:程序通事 」欢迎关注和转载,保留摘要,谢谢! 使用 Java 阻塞 I/O 模型读取数据,将会导致线程阻塞,线程将会进入休眠,从而 ...

  9. 一文读懂Java线程状态转换

    前言 本文描述Java线程线程状态及状态转换,不会涉及过多理论,主要以代码示例说明线程状态如何转换. 基础知识 1. 线程状态 Thread源码中的状态说明: 线程可以有6种状态: New(新建) R ...

随机推荐

  1. NOIP计划索引

    药丸的节奏 亟待解决的问题 灵光一现的trick 2018上学期刷题记录 NOIP2018 - 暑期博客整理 NOIP2018 - 一些板子 NOIP2018 - 每日填坑

  2. ubuntu系统普通用户密码忘记之重置

    当我们在使用ubuntu系统忘记普通用户登录密码的时候,会被系统在登录界面拒之门外而不得入,这时候只好需要我们去重新设置密码,具体做法如下: 系统重启,在GRUB模式下选择Advanced Optio ...

  3. pycharm安装 suds模块报错:AttributeError: module 'pip' has no attribute 'main'

    需求:安装suds模块 遇到的问题: 一.报错信息:[file][Default Settint]---Project Interpreter 点击 搜索suds安装模块报错 解决:依据上图提示找到C ...

  4. DELL PowerEdge R620安装Windows server(你想将windows安装在何处”找不到任何本地磁盘,“找不到驱动器”)已解决!

    你可能碰到过DELL服务器上安装Windows server系列系统时无法识别或找不到硬盘的问题,对于DELL PowerEdge11-14代机器的,大家可以采用DELL的Lifecycle cont ...

  5. CentOS7的systemctl使用

    CentOS 7开始,CentOS开始使用systemd服务来代替daemon,原来管理系统启动和管理系统服务的相关命令全部由systemctl命令来代替. 1.原来的 service 命令与 sys ...

  6. Linux 用户管理(三)

    一.userdel --delete a user account and related files -r  --remove 删除用户及家目录 二.id --print real and effe ...

  7. PyCharm2019 激活方式

    1.修改hosts激活:需要修改hosts,稳定无影响,持续更新,推荐~ 一.修改hosts激活 1.修改hosts文件 将0.0.0.0 account.jetbrains.com和0.0.0.0 ...

  8. hdu 4565

    Problem Description A sequence Sn is defined as:Where a, b, n, m are positive integers.┌x┐is the cei ...

  9. jmeter switch controller

    工作方式: Switch控制器通过给该控制器中的Value赋值,来指定运行哪个采样器.有两种赋值方式: 1.第一种是数值,Switch控制器下的子节点从0开始计数,通过指定子节点所在的数值来确定执行哪 ...

  10. ADB命令后台修改系统默认输入法

    今天要研究uiautomator如何输入中文,看网上有一种常用的解决办法:http://www.cnblogs.com/yajing-zh/p/5125387.html在这篇博客最后提出来的问题,也是 ...