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();
        }
    
    }
  • 相关阅读:
    持续集成系统敏捷开发的基石
    云计算对IT产业的影响
    类封装的驱动程序
    竹林蹊径:深入浅出Windows驱动开发
    云计算的SPI服务模型
    什么是云计算
    多态
    我们需要什么样的计算
    电子工业的发展也带动了电子设计自动化技术
    云计算的部署模型
  • 原文地址:https://www.cnblogs.com/taoshihan/p/5475566.html
Copyright © 2011-2022 走看看