zoukankan      html  css  js  c++  java
  • 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();
        }
    }
  • 相关阅读:
    给大家介绍几个网站学习前端和服务器语言的网站吧,一定有合适你的
    centos用yum安装软件提示:另外一个程序锁定了 yum;等待它退出
    模仿小猎CMS首页功能展示的JS效果
    在centos下安装Node.js 开发环境搭建
    discuz在IIS,apache中分别怎么设置伪静态
    CentOS系统下各文件夹的作用
    centos上网设置
    php微信公众平台开发获取access_token,用CURL出现certificate verify failed错误的解决方法
    12.9 NIO
    12.8 Java 9改进的对象序列化
  • 原文地址:https://www.cnblogs.com/benjamin77/p/9137925.html
Copyright © 2011-2022 走看看