美文网首页
java多线程学习小案例

java多线程学习小案例

作者: 秃头大叔 | 来源:发表于2017-11-29 14:31 被阅读0次

多线程的小练习

需求:实现一次修改一次输出

主要知识点:多线程,同步,等待和唤醒


public class inAndOut {

    /**
     * @param args
     */
    public static void main(String[] args) {
        
        // 1、两个线程控制同一个对象      参数传入
        // 2、同步    变性问题(赋值到一半就输出了)         
        // 3、一次修改一次输出  wait 和 notify
        
        
        Test tt = new Test();   // 给两个不同现成提供同一个对象
        In in = new In(tt);
        Out out = new Out(tt);
        Thread ti = new Thread(in);
        Thread to = new Thread(out);
        ti.start();
        to.start();
    }

}
class In implements Runnable{
    private Test r;
    private boolean a = true;
    
    @Override
    public void run() {
        
        while(true){
            synchronized (r) {  //处理变性问题
                if(r.b){   // 修改为一条输出一条  现成的等待和唤醒                in执行时,out等待。  执行完后唤醒,out执行,in等待。。。。
                    if(a){  // 模拟不同的输入
                        r.name = "zhangsan";
                        r.sex = "nan";
                        a = false;
                    }else{
                        r.name = "lisi";
                        r.sex = "nv";
                        a=true;
                    }
                    r.b=false;
                    r.notify();  // 唤醒进程
                    
                }else{
                    try {
                        r.wait();  //当前进程等待
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    In(Test r){
        this.r = r;
    }
    
}
class Out implements Runnable{
    private Test r;
    @Override
    public void run() {
        while(true){
            synchronized (r) {
                if(!r.b){
                    System.out.println(r.name+"..."+r.sex);
                    r.b = true;
                    r.notify();
                }else{
                    try {
                        r.wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    Out(Test r){
        this.r = r;
    }
    
}
class Test{
    String name;
    String sex;
     boolean b = true;
}

相关文章

网友评论

      本文标题:java多线程学习小案例

      本文链接:https://www.haomeiwen.com/subject/orwubxtx.html