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();
        }
    }
  • 相关阅读:
    c++设计模式:工厂模式(Factory Pattern)
    lua和tolua++的安装
    c++设计模式:观察者模式(Observer Pattern)
    c++设计模式:抽象工厂模式(Abstract Factory Pattern)
    linux下搭建eclipsec++开发环境
    c++设计模式:单件模式(Singleton Pattern)
    SQL SERVER查询Job每个步骤执行结果情况
    XMLA清空Cube缓存
    【转载】SSIS 包组件的命名规则
    SQL SERVER 游标删除无数据试图
  • 原文地址:https://www.cnblogs.com/benjamin77/p/9137925.html
Copyright © 2011-2022 走看看