美文网首页
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