zoukankan      html  css  js  c++  java
  • [javaSE] 并发编程(线程间通信)

    新建一个资源类Resource

    定义成员变量String name

    定义成员变量int age

    新建一个输入类Input,实现Runnable接口

    定义一个构造方法Input(),传入参数:Resource对象

    实现run()方法

    定义while(true)Resuorce对象的属性赋值

    新建一个输出类Output,实现Runnable接口

    定义一个构造方法Output(),传入参数:Resource对象

    实现run()方法

    定义while(true)打印Resuorce对象的属性

    main方法中

    获取Resource对象,new出来

    获取Input对象,new出来,构造参数:Resource对象

    获取Output对象,new出来,构造参数:Resource对象

    获取Thread对象,new出来,构造参数:Runnable对象

    调用Thread对象的start()方法,开启线程

    此时会有线程安全问题,查看结果可以发现,汉字和拼音的混了

    陶士涵=====

    taoshihan=====nan

    陶士涵=====nan

    陶士涵=====nan

    陶士涵=====

    陶士涵=====

    陶士涵=====nan

    陶士涵=====nan

    taoshihan=====nan

    taoshihan=====nan

    使用synchronized(){}同步代码块包裹操作同一个资源的地方

    注意同步线程的个数,所有的线程都应该加上

    注意是否是同一个锁,synchronized()括号内的锁参数:保证是个唯一的资源

    使用synchronized(){}包裹上面的赋值和打印,锁:Resource对象(唯一的)

    查看结果,此时没有安全问题

    陶士涵=====

    陶士涵=====

    陶士涵=====

    taoshihan=====nan

    taoshihan=====nan

    taoshihan=====nan

    死锁问题:同步中嵌套同步,并且锁不一致,此时会造成死锁问题

    /**
     * 资源
     * 
     * @author taoshihan
     * 
     */
    class Resource {
        String name;
        String sex;
    }
    
    /**
     * 输入
     * 
     * @author taoshihan
     * 
     */
    class Input implements Runnable {
        private Resource resource;
    
        public Input(Resource resource) {
            this.resource = resource;
        }
    
        @Override
        public void run() {
            // 切换
            boolean flag = true;
            while (true) {
                synchronized (resource) {
                    if (flag) {
                        resource.name = "taoshihan";
                        resource.sex = "nan";
                    } else {
                        resource.name = "陶士涵";
                        resource.sex = "男";
                    }
                    flag = !flag;
                }
            }
        }
    
    }
    
    /**
     * 输出
     * 
     * @author taoshihan
     * 
     */
    class Output implements Runnable {
        private Resource resource;
    
        public Output(Resource resource) {
            this.resource = resource;
        }
    
        @Override
        public void run() {
            while (true) {
                synchronized (resource) {
                    System.out.println(resource.name + "=====" + resource.sex);
                }
            }
        }
    
    }
    
    public class InputOutputDemo {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            Resource resource = new Resource();
            Input input = new Input(resource);
            Output output = new Output(resource);
    
            Thread t1 = new Thread(input);
            Thread t2 = new Thread(output);
            t1.start();
            t2.start();
        }
    
    }
  • 相关阅读:
    HAOI2018 简要题解
    HAOI2017 简要题解
    BZOJ 5477: 星际穿越
    HAOI2016 简要题解
    C#oracle还原imp实例
    oracle备份imp命令大全
    C#oracle备份和还原
    win10安装CAD后出现致命错误
    Oracle 恢复数据后,数据库中中文变成问号解决方法
    CAD 安装时出现.net frameword 3.5安装不上的问题
  • 原文地址:https://www.cnblogs.com/taoshihan/p/5475566.html
Copyright © 2011-2022 走看看