Java

Java16-7 练习

2018-11-26  本文已影响0人  第二套广播体操
class Data{
    String name;
    String sex;
}
class Input implements Runnable{
    private Data data;

    public Input(Data data) {
        this.data = data;
    }

    @Override
    public void run() {
          int x=0;
        for (int i = 0; i <20; i++) {


          if (x==0){
             data.name="于松江";
             data.sex="男";
          }
          else {
              data.name="程泽琪";
              data.sex="女";
          }
           x=(x+1)%2;
        }
    }
}
class OutPut implements Runnable{
    private Data data;

    public OutPut(Data data) {
        this.data = data;
    }
 @Override
    public void run() {
        for (int i = 0; i <20; i++) {
            System.out.println("线程"+Thread.currentThread().getName()+"\t"+data.name+data.sex);
        }
    }
}

public class InputDemo {
    public static void main(String[] args)
    {
        Data data=new Data();
        Input input=new Input(data);
        OutPut outPut=new OutPut(data);
        Thread thread1=new Thread(input,"录入线程");
        Thread thread2=new Thread(outPut,"输出线程");
    }
}

程序结果

解决多线程中输出错误的问题

分析:
1、找到共享数据
2、线程任务中是否有多条操作共享数据的代码
解决方法:

class Data{
   private String name;
    private String sex;
    public synchronized void set(String name,String sex){
        this.name=name;
        this.sex=sex;
    }
    public synchronized void out(){
        System.out.println("线程"+Thread.currentThread().getName()+"\t"+name+"\t"+sex);
    }
}

同步 但是会出现一出来一大片的情况 所以我们使用等待唤醒机制改善

class Data{
   private String name;
    private String sex;
    private boolean sign;//定义标记
    public synchronized void set(String name,String sex){
        if (sign)
            try {this.wait();}catch (InterruptedException e){}
       this.name=name;
        this.sex=sex;
        sign=true;
        this.notify();

    }

使用Lock和监听器

class Data{
   private String name;
    private String sex;
    private boolean sign;//定义标记
    private final Lock lock=new ReentrantLock();//锁
    private Condition in =lock.newCondition();//录入监视器
    private Condition out=lock.newCondition();//输出监视器
    public void set(String name,String sex){
        lock.lock();
        while (sign)
            try {
                in.await();}catch (InterruptedException e){}
       this.name=name;
        this.sex=sex;
        sign=true;
        out.signal();
        lock.unlock();

    }
    public synchronized void out(){
        lock.lock();
         if (!sign)
             try {
                 out.await();}catch (InterruptedException e){}
        System.out.println("线程"+Thread.currentThread().getName()+"\t"+name+"\t"+sex);
        sign=false;
       in.signal();
       lock.unlock();

    }
}
上一篇下一篇

猜你喜欢

热点阅读