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();
    }
}

猜你喜欢

转载自www.cnblogs.com/benjamin77/p/9137925.html