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();
        }
    }
  • 相关阅读:
    php 换行 PHP_EOL
    removeAttribute与removeAttributeNode的区别
    百度地图api 常用 例子
    nth-child()伪类选择器
    c++ 11 lambda表达式
    mysql sql时间戳格式化语句
    Apache Forbidden 403错误提示
    MySQL中查询所有数据库占用磁盘空间大小
    luaj使用 方法签名规则 Cocos2dxLuaJavaBridge
    nginx代理配置备份
  • 原文地址:https://www.cnblogs.com/benjamin77/p/9137925.html
Copyright © 2011-2022 走看看