CountDownLatch与Binder连接池

news2024/11/25 6:51:16

CountDownLatch与Binder连接池

CountDownLatch

如果现在有一个题,有5个数,这时候我想让这5个数同时都乘2,然后算出结果后再算它们的平均数

这时候就可以用CountDownLatch

import java.util.concurrent.CountDownLatch;
public class Example {
    public static void main(String[] args) throws InterruptedException {
        int[] data = {1, 2, 3, 4, 5};
        int numTasks = 5;
        CountDownLatch latch = new CountDownLatch(numTasks);

        double[] results = new double[numTasks];
        for (int i = 0; i < numTasks; i++) {
            final int taskId = i;
            new Thread(() -> {
                // 模拟任务处理过程
                double result = data[taskId] * 2.0;
                results[taskId] = result;
                latch.countDown();
            }).start();
        }

        // 等待所有任务完成
        latch.await();

        // 计算平均值
        double sum = 0.0;
        for (double result : results) {
            sum += result;
        }
        double avg = sum / numTasks;
        System.out.println("Average: " + avg);
    }

我们定义了个数组,这个数组存放了{1,2,3,4,5}

然后我们

 CountDownLatch latch = new CountDownLatch(numTasks);

让这5个同时开始

double[] results = new double[5];

然后开一个线程让data[i]中的每个元素乘以2.0

要是其中有一个完成了任务便会执行

latch.countDown();

进行减一操作,当计数器的值减到 0 时,主线程就会从 await() 方法中返回,可以开始计算平均值。

Binder连接池

在Binder连接池中,我们也会用到CountDownLatch

Binder连接池主要是解决AIDL中AIDL过多导致Service过多,让程序运行太慢

它让所有AIDL在一个Service中

比如我要弄一个加密代码,解密代码和加法运算

Aidl

interface ISecurityCenter {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
     String encrypt(String content);
     String decrypt(String password);
}

定义了这个接口用来加密和解密

interface ICompute {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
   int add(int a , int b);
}

这个是用来进行加法运算

然后再定义一个查询接口

interface IBinderPool {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    IBinder queryBinder(int binderCode);
}

Service

public class BinderPoolService extends Service {
    private Binder mBinderPool = new BinderPoolImpl();
    public BinderPoolService() {
    }
    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
//        throw new UnsupportedOperationException("Not yet implemented");
        return mBinderPool;
    }

    //
    public static class SecurityCenterImpl extends ISecurityCenter.Stub{
        //加密
        private static final char SECRET_CODE = '^';
        @Override
        public String encrypt(String content) throws RemoteException {
            char[]chars = content.toCharArray();
            for(int i = 0;i<chars.length;i++){
                chars[i]^= SECRET_CODE;
            }
            return new String(chars);
        }
        //解密
        @Override
        public String decrypt(String password) throws RemoteException {
            return encrypt(password);
        }
    }



    public static class ComputeImpl extends ICompute.Stub{
        @Override
        public int add(int a, int b) throws RemoteException {
            return a+b;
        }
    }

    public class BinderPoolImpl extends IBinderPool.Stub{

        @Override
        public IBinder queryBinder(int binderCode) throws RemoteException {
            IBinder binder = null;
            switch (binderCode){
                case 0:
                    binder = new SecurityCenterImpl();
                    break;
                case 1:
                    binder = new ComputeImpl();
                    break;
                default:
                    break;
            }
            return binder;
        }
    }
}

service端还比较简单,基本就和aidl那块一样

然后是Binder连接池

Binder连接池

public class BinderPoolClient {
    private Context mContext;
    private IBinderPool mIBinderPool;
    private static volatile BinderPoolClient sInstance;
    private CountDownLatch mConnectBinderPoolCountDownLatch;

    public BinderPoolClient(Context context) {
        mContext = context.getApplicationContext();
        connectBinderPoolService();
    }

    public static BinderPoolClient getInstance(Context context){
        if(sInstance==null){
            synchronized (BinderPoolClient.class) {
                if(sInstance==null) {
                    sInstance = new BinderPoolClient(context);
                }
            }
        }
        return sInstance;
    }


    private synchronized void connectBinderPoolService(){
        mConnectBinderPoolCountDownLatch = new CountDownLatch(1);
        Intent service = new Intent(mContext,BinderPoolService.class);

        mContext.bindService(service,mBinderPoolConnection,Context.BIND_AUTO_CREATE);

        try {
            mConnectBinderPoolCountDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    private ServiceConnection mBinderPoolConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mIBinderPool = IBinderPool.Stub.asInterface(service);

            try {
                mIBinderPool.asBinder().linkToDeath(mBinderPoolDeathRecipient,0);
            } catch (RemoteException e) {
                e.printStackTrace();
            }


            mConnectBinderPoolCountDownLatch.countDown();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

    private IBinder.DeathRecipient mBinderPoolDeathRecipient = new IBinder.DeathRecipient() {
        @Override
        public void binderDied() {
            Log.d("TAG","binder died");
            mIBinderPool.asBinder().unlinkToDeath(mBinderPoolDeathRecipient,0);
            mIBinderPool = null;
            connectBinderPoolService();
        }
    };
    public synchronized IBinder queryBinder(int binderCode){
        IBinder iBinder = null;
            try {
                iBinder = mIBinderPool.queryBinder(binderCode);

            } catch (RemoteException e) {
                e.printStackTrace();

        }
        return iBinder;
    }
}

Client

aidlPool.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Thread thread = new Thread(new Runnable() {
                    @Override
                    public void run() {
                        doWork();
                    }
                });
                thread.start();
//       
            }
        });
        
        
	private void doWork(){
        BinderPoolClient binderPoolClient = BinderPoolClient.getInstance(MainActivity.this);
        IBinder binder = binderPoolClient.queryBinder(0);
        ISecurityCenter iSecurityCenter = BinderPoolService.SecurityCenterImpl.asInterface(binder);
        Log.d("TAG","visit ISecurityCenter");
        String msg = "helloworld-Android";
        Log.d("TAG",msg);

        try {
            String password = iSecurityCenter.encrypt(msg);
            Log.d("TAG","encrypt:"+password);
            Log.d("TAG","decrypt:"+iSecurityCenter.decrypt(password));
        } catch (RemoteException e) {
            e.printStackTrace();
        }

        Log.d("TAG","visit ICompute");
        IBinder binder1 = binderPoolClient.queryBinder(1);
        ICompute iCompute = BinderPoolService.ComputeImpl.asInterface(binder1);

        try {

            Log.d("TAG","add"+iCompute.add(4,5));
        } catch (RemoteException e) {
            e.printStackTrace();
        }


    }

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/534730.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

总结853

学习目标&#xff1a; 月目标&#xff1a;5月&#xff08;张宇强化前10讲&#xff0c;背诵15篇短文&#xff0c;熟词僻义300词基础词&#xff09; 周目标&#xff1a;张宇强化前3讲并完成相应的习题并记录&#xff0c;英语背3篇文章并回诵 每日必复习&#xff08;5分钟&#…

leetcode(力扣)刷题笔记(c++)【下】

文章预览&#xff1a; 单调栈739. 每日温度496.下一个更大元素 I503. 下一个更大元素 II42. 接雨水84.柱状图中最大的矩形 额外题目1365.有多少小于当前数字的数字941. 有效的山脉数组1207. 独一无二的出现次数189. 轮转数组724. 寻找数组的中心下标922. 按奇偶排序数组 II 后续…

软考高级架构师笔记-3数据库

目录 1. 前言 & 更新2. 数据库基本概念3. E-R图与二维表4. 约束、范式5. 数据库新技术1. 前言 & 更新 前文回顾: 软考高级架构师笔记-1计算机硬件软考高级架构师笔记-2计算机软件(操作系统)本章考情: 数据库章节都会考3-5分左右,第二版教材上对应2.3.3和6,主要考…

软考A计划-真题-分类精讲汇总-第十四章(数据流图)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

Python每日一练(20230517) 最大连续1的个数 I\II\III

目录 1. 最大连续1的个数 I Max Consecutive Ones &#x1f31f; 2. 最大连续1的个数 II Max Consecutive Ones &#x1f31f;&#x1f31f; 3. 最大连续1的个数 III Max Consecutive Ones &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; G…

RabbitMQ养成记 (5. MQ的topics模式)

主题模式 Topic类型的Exchange与Direct相比&#xff0c;都是可以根据RoutingKey把消息路由到不同的队列。只不过Topic类型Exchange可以让队列在绑定Routing key 的时候使用通配符&#xff01; Routingkey 一般都是有一个或多个单词组成&#xff0c;多个单词之间以”.”分割&a…

【夜莺(Flashcat)V6监控】2.夜莺告警相关: 多服务器多业务配置

介绍 本章侧重点是应用&#xff0c;根据大家不同业务、服务器部署众多等等&#xff1b;根据不同团队&#xff0c;不同业务进行划分&#xff1b;方便不同的团队负责自己职责内的工作&#xff1b; 比如我们场景如下&#xff1a; 三块业务&#xff1a;人工智能、医药、团购&…

分层强化学习 学习笔记

分层强化学习代码汇总 0.综述 《The Promise of Hierarchical Reinforcement Learning》分层强化学习的前景 强化学习 强化学习问题的设置&#xff1a; 有两个主角&#xff1a;一个代理和一个环境。环境是代理所生活和交互的地方。在每一次交互中&#xff0c;代理都能看到世…

深度解析:5G与未来天线技术 5G通信到底需要什么样的天线?

过去二十年&#xff0c;我们见证了移动通信从1G到4G LTE的转变。在这期间&#xff0c;通信的关键技术在发生变化&#xff0c;处理的信息量成倍增长。而天线&#xff0c;是实现这一跨越式提升不可或缺的组件。 按照业界的定义&#xff0c;天线是一种变换器&#xff0c;它把传输…

一图看懂 et_xmlfile 模块:一个用于创建大型XML文件的低内存库,资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创&#xff0c;转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 et_xmlfile 模块&#xff1a;一个用于创建大型XML文件的低内存库&#xff0c;资料整理笔记&#xff08;大全&#xff09; &#x1f9ca;摘要&#x1f9ca;解释&#x1f9ca…

网络进阶学习:子网掩码及VLAN划分

网络进阶学习&#xff1a;子网掩码及VLAN划分 什么是子网&#xff1f;什么是子网掩码&#xff1f;什么是VLAN子网掩码和VLAN的关系小结 什么是子网&#xff1f; ⭐子网是将一个大的IP地址段划分成若干个小的IP地址段的网络。子网可以帮助网络管理员更好地管理网络&#xff0c;…

reids学习--redis常用命令

字符串string操作命令 Redis中字符串类型常用命令&#xff1a; 操作描述set key value设置指定key的值get key获取指定key的值setex key seconds value设置指定key的值&#xff0c;并将key的过期时间设为seconds秒(可用于验证码登录)setnx key value只有在key不存在时设置key…

玩转SAM语义分割之(2)显示特定的图片

文章目录 1. 使用matplotlib显示出完整彩色的掩码&#xff0c;并将其保存下来 2. 使用matplotlib显示出单张掩码&#xff0c;只保存面积大于一个阈值的掩码图片3. 对一整个文件夹中的图片进行处理&#xff0c;只保存面积大于一定阈值的掩码图片4. 查看特定坐标点处是否有mask掩…

Go语言的并发:goroutine和channel

目录 【Go 的并发方案&#xff1a;goroutine】 goroutine 的基本用法 【通道channel】 创建channel&#xff1a; 发送与接收变量&#xff1a; 关闭channel&#xff1a; 【channel的类型】 无缓冲channel和带缓冲channel 无缓冲channel 带缓冲channel nil channel 单…

随便聊聊 顺便晒一下我的听歌设备

平时最大的爱好就是听歌了&#xff0c;我平时的听歌类型挺多元化的&#xff0c;硬要说的话更偏向 Jpop、ACG、女声、轻音乐、大编制、交响乐&#xff0c;当然好听的都听不局限于类型。 又是30天一天不落O(∩_∩)O&#x1f604; 作为一个音乐爱好者&#xff0c;在听歌设备上面花…

Liunx压缩命令 - zip

zip命令 – 压缩文件 zip命令的功能是用于压缩文件&#xff0c;解压命令为unzip。通过zip命令可以将文件打包成.zip格式的压缩包&#xff0c;里面会包含文件的名称、路径、创建时间、上次修改时间等等信息&#xff0c;与tar命令相似。 语法格式&#xff1a;zip 参数 目标文件…

MySQL高级_第04章_逻辑架构

MySQL高级_第04章_逻辑架构 1. 逻辑架构剖析 1.1 服务器处理客户端请求 那服务器进程对客户端进程发送的请求做了什么处理&#xff0c;才能产生最后的处理结果呢&#xff1f;这里以查询请求为例展示&#xff1a; 下面具体展开看一下&#xff1a; 1.2 Connectors 1.3 第1…

Go 本地缓存 bigcache

​本地缓存已经算是数据库的常规设计了&#xff0c;因为数据直接缓存在机器内存中&#xff0c;避免昂贵的IO开销&#xff0c;数据的读取和写入快到不可思议。本地缓存常驻在内存中&#xff0c;就好像业务逻辑中声明的全局变量一样&#xff0c;不会被垃圾回收。但本地内存也会导…

JavaScript:new操作符

一、new操作符的作用 用于创建一个给定构造函数的实例对象 new操作符创建一个用户定义的对象类型的实例 或 具有构造函数的内置对象的实例。二、new一个构造函数的执行过程 2.1、创建一个空对象obj 2.2、将空对象的原型与构造函数的原型连接起来 2.3、将构造函数中的this绑定…

CPU的功能和组成

CPU的功能和组成 CPU是控制计算机自动完成取指令和执行指令任务的部件&#xff0c;是计算机的核心部件、简称CPU 功能&#xff1a; 指令控制&#xff1a;对程序的顺序控制也是对指令执行的顺序控制&#xff08;PC、JMP&#xff09;操作控制&#xff1a;产生各种操作信号&…