• 多线程-线程同步、异步


    同步和异步

      同步和异步通常用来形容一次方法的调用。同步方法调用一旦开始,调用者必须完成所有的操作一直到方法调用结束,其他调用者才能继续后续的行为,

    异步方法调用类似一个消息传递,一旦开始,方法调用就会立即返回,其他调用者则可以无需等待,可以立即继续后续的操作。

    异步:

    不过, 如果 我们 赶时髦, 就坐 在家 里 打开 电脑, 在 网上 订购 了 一台 空调。 当你 完成 网上 支付 的 时候, 对 你来 说 购物 过程 已经 结束 了。 虽然 空调 还没 送 到家, 但是 你的 任务 都已 经 完成 了。 商家 接到 了 你的 订单 后, 就会 加紧 安排 送货, 当然 这一 切 已经 跟你 无关 了。 你 已经 支付 完成, 想 干什么 就 能去 干什么, 出去 溜 几 圈 都不 成问题, 等 送货上门 的 时候, 接到 商家 的 电话, 回家 一 趟 签收 就 完事 了。 这就 是 异步 调用。

    public class MyThread3 {
        private synchronized void method1() {
            try {
                System.err.println("线程:" + Thread.currentThread().getName());
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        private  void metho2() {
            System.err.println("线程:" + Thread.currentThread().getName());
        }
    
        public static void main(String[] agrs) {
            MyThread3 t = new MyThread3();
            Thread a = new Thread(new Runnable() {
                @Override
                public void run() {
                    t.method1();
                }
            }, "t1");
            Thread b = new Thread(new Runnable() {
                @Override
                public void run() {
                    t.metho2();
                }
            }, "t2");
            a.start();
            b.start();
        }
    
    }

    运行结果:

    同步:

    打个 比方, 比如 我们 去 购物, 如果 你去 商场 实体 店 买 一台 空调, 当你 到了 商场 看 中了 一 款 空调, 你就 想 售货员 下单。 售货员 去 仓库 帮你 调配 物品。 这 天 你 热得 实在 不行了, 就 催 着 商家 赶紧 给你 送货, 于是 你就 等在 商 店里, 候 着 他们, 直到 商家 把你 和 空调 一起 送 回家, 一次 愉快 的 购物 就 结束 了。 这就是 同步 调用。

    /**
         * 同步:synchronized
         *      同步的概念就是共享,如果不是共享资源则没必要进行同步;同步的目的是为了线程安全,线程安全只需要满足该特性:原子性(同步)、可见性
         */
    
        private synchronized void metho2() {
            System.err.println("线程:" + Thread.currentThread().getName());
        }

    运行结果:等待了2秒钟

      1.a线程先获取了t对象的锁,b线程可以异步访问t对象的方法 metho2() 无 synchronized 修饰的方法。

      2.a线程获取了t对象的锁,b线程争取去那t对象的锁,这个时候对象使用同步 synchronized 修饰了metho2() 方法,a线程休眠了2秒,metho2() 方法的锁还么有释放,2秒后,锁被释放了,a对象的操作全部结束;b线程这个时候才真正的拿到了t对象的锁,去调用metho2() 方法。

  • 相关阅读:
    Android Studio打包过程和应用安装过程
    MVP模式和Clean模式
    Gradle入门学习---认识buildeTypes和dependencies
    微信小程序官方DEMO解读
    从ListView逐步演变到RecyclerView
    Mac下如何配置环境变量
    Android上滑手势触发和不增加布局层级扩大点击区域
    寻找Fragment的替代品的尝试
    高效的策略模式设计方法
    利用ListView的基本方法实现效果
  • 原文地址:https://www.cnblogs.com/xxt19970908/p/6965180.html
Copyright © 2020-2023  润新知