网站建设 硬件/百度交易平台官网
一.binder通信原理
Binder 是 Android 系统中用于跨进程通信的一种机制,它允许一个进程中的组件与另一个进程中的组件进行通信,从而实现进程间通信 (IPC)。Binder 机制是基于 Linux 内核提供的进程间通信机制 (IPC) 实现的。
在 Binder 机制中,每个进程都有一个 Binder 驱动程序,它负责管理该进程中的所有 Binder 对象。每个 Binder 对象都有一个唯一的标识符,称为 Binder 标识符 (Binder identity),它可以用于在进程之间传递 Binder 引用。Binder 机制允许在客户端进程和服务进程之间建立一个通信通道 (communication channel),客户端可以通过这个通道向服务端发送请求,服务端可以处理请求并返回结果。
Binder 机制中的主要组件包括以下几个部分:
Binder 驱动程序:负责管理 Binder 对象,以及为客户端进程和服务进程之间建立通信通道。
Binder 对象:具有唯一标识符的对象,用于在进程之间传递引用。
Binder 接口:定义了客户端可以调用的方法,以及服务端可以实现的方法。
Binder 代理 (Proxy):客户端进程中的对象,用于与服务端进程通信,并代表客户端调用服务端的方法。
Binder Stub:服务端进程中的对象,用于实现 Binder 接口,并处理客户端发送的请求。
使用 Binder 机制可以实现跨进程通信,例如在 Android 应用程序中,可以使用 AIDL (Android Interface Definition Language) 定义接口和方法,并使用 Binder 机制在客户端进程和服务端进程之间进行通信。这样可以使应用程序更加灵活和高效,例如可以将耗时的操作放在服务端处理,减少客户端的负担,提高应用程序的性能和响应速度。
二.AIDL概念
1.概念
AIDL(Android Interface Definition Language)是一种 IDL 语言,用于生成可以在 Android 设备上两个进程之间进行进程间通信(IPC)的代码。 通过 AIDL,可以在一个进程中获取另一个进程的数据和调用其暴露出来的方法,从而满足进程间通信的需求。通常,暴露方法给其他应用进行调用的应用称为服务端,调用其他应用的方法的应用称为客户端,客户端通过绑定服务端的 Service 来进行交互。
只有当你允许来自不同的客户端访问你的服务并且需要处理多线程问题时你才必须使用AIDL”,其他情况下你都可以选择其他方法,如使用 Messenger,也能跨进程通信。可见 AIDL 是处理多线程、多客户端并发访问的,而 Messenger 是单线程处理。
2.创建aidl
我们在android studio中创建aidl的方法如下:
![](https://img-blog.csdnimg.cn/img_convert/f09da9df946568cf1158b247ea7c6736.png)
默认情况下,AIDL 支持下列数据类型:
八种基本数据类型:byte、char、short、int、long、float、double、boolean
String、CharSequence
List类型。List承载的数据必须是AIDL支持的类型,或者是其它声明的AIDL对象
Map类型。Map承载的数据必须是AIDL支持的类型,或者是其它声明的AIDL对象
三. 一个APK间不用AIDL进行binder通信
定义三个java class,分别为MyService.java,MyBinder.Java,MainActivity.java
MyService.java的定义如下:
package com.example.binder;import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;public class MyService extends Service {public MyService() {}@Overridepublic IBinder onBind(Intent intent) {MyBinder mBinder = new MyBinder();return mBinder;}
}
package com.example.binder;import android.os.Binder;
import android.util.Log;public class MyBinder extends Binder {final String TAG = "zhongjun_MyBinder";public void sayHello() {Log.d(TAG, "Hello from service!");}
}
package com.example.binder;import androidx.appcompat.app.AppCompatActivity;import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.View;
import android.widget.Button;public class MainActivity extends AppCompatActivity {final String TAG = "zhongjun_MainActivity";private MyBinder binder;private boolean bound = false;Button myButton;private ServiceConnection connection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName componentName, IBinder iBinder) {Log.d(TAG, "onServiceConnected");bound = true;binder = (MyBinder) iBinder;binder.sayHello();}@Overridepublic void onServiceDisconnected(ComponentName componentName) {Log.d(TAG, "onServiceDisconnected");bound = false;}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Intent intent = new Intent(this, MyService.class);myButton = findViewById(R.id.my_button);myButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 处理按钮点击事件Log.d(TAG, "click button ");bindService(intent, connection, Context.BIND_AUTO_CREATE);}});}
}
ServiceConnection 是 Android 应用程序中用于连接和管理服务的接口。它允许客户端应用程序与服务进行通信并获取服务提供的数据或执行服务提供的操作。
ServiceConnection 接口中定义了两个方法:onServiceConnected() 和 onServiceDisconnected()。onServiceConnected() 方法在客户端应用程序成功绑定到服务时调用,该方法提供了一个 IBinder 对象,该对象可以用于与服务进行通信。onServiceDisconnected() 方法在客户端应用程序与服务断开连接时调用。
使用 ServiceConnection,客户端应用程序可以绑定到一个服务并发送请求,服务可以在收到请求后执行相应的操作并返回结果。客户端应用程序还可以使用 ServiceConnection 监听服务的连接状态,并在服务连接断开时采取相应的措施,例如重新绑定服务或提示用户。
总之,ServiceConnection 是 Android 应用程序中用于连接和管理服务的重要接口,它允许客户端应用程序与服务进行通信并控制服务的连接状态。在开发 Android 应用程序时,开发人员通常需要实现 ServiceConnection 接口来管理应用程序与服务之间的通信和连接。
Intent intent = new Intent(this, MyService.class);
这行代码是创建一个 Intent 对象,用于启动或绑定 MyService 类中定义的服务。
第一个参数 this 是当前上下文对象,用于标识 Intent 的来源。在这个例子中,this 可能是一个 Activity 或者一个 Service。
第二个参数 MyService.class 是服务的类名。它告诉系统要启动或绑定哪个服务。
创建 Intent 对象后,可以使用 startService() 方法启动服务,或使用 bindService() 方法绑定服务。如果希望服务在后台持续运行并执行某些操作,通常会使用 startService() 方法启动服务。如果希望与服务进行交互并执行某些操作,通常会使用 bindService() 方法绑定服务。
例如,如果要启动 MyService,可以使用以下代码:
Intent intent = new Intent(this, MyService.class);
startService(intent);
如果要绑定到 MyService,并获取服务提供的数据或执行服务提供的操作,可以使用以下代码:
Intent intent = new Intent(this, MyService.class);
bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);
其中,mServiceConnection 是一个 ServiceConnection 对象,用于管理服务的连接状态。BIND_AUTO_CREATE 参数表示如果服务不存在,则会自动创建一个。
AndroidManifest.xml为
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"><applicationandroid:allowBackup="true"android:dataExtractionRules="@xml/data_extraction_rules"android:fullBackupContent="@xml/backup_rules"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:supportsRtl="true"android:theme="@style/Theme.Binder"tools:targetApi="31"><serviceandroid:name=".MyService"android:enabled="true"android:exported="true" /><activityandroid:name=".MainActivity"android:exported="true"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>
四.一个APK间用AIDL进行binder通信
一共有两个类MainActivity.java,Myservice.java跟一个aidl文件MyAidlInterface.aidl
MainActivity.java
package com.example.aidl_signal;import androidx.appcompat.app.AppCompatActivity;import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import android.view.View;
import android.widget.Button;public class MainActivity extends AppCompatActivity {final String TAG = "zhongjun_MainActivity";Button myButton;private ServiceConnection mServiceConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName componentName, IBinder iBinder) {MyAidlInterface mMyAidlInterface = MyAidlInterface.Stub.asInterface(iBinder);try{int result = mMyAidlInterface.add(1, 2);Log.d(TAG, "mMyAidlInterface.add:" + result);}catch (RemoteException e) {Log.e(TAG, "RemoteException: " + e.getMessage());}}@Overridepublic void onServiceDisconnected(ComponentName componentName) {}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Intent intent = new Intent(this, MyService.class);myButton = findViewById(R.id.my_button);myButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 处理按钮点击事件Log.d(TAG, "click button ");bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);}});}
}
Myservice.java
package com.example.aidl_signal;import android.app.Service;
import android.content.Intent;
import android.os.IBinder;public class MyService extends Service {@Overridepublic IBinder onBind(Intent intent) {return new MyServiceImpl();}private class MyServiceImpl extends MyAidlInterface.Stub{// 这是一个示例方法public int add(int a, int b) {return a + b;}}
}
MyAidlInterface.aidl
// MyAidlInterface.aidl
package com.example.aidl_signal;// Declare any non-default types here with import statementsinterface MyAidlInterface {int add(int a, int b);
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"><applicationandroid:allowBackup="true"android:dataExtractionRules="@xml/data_extraction_rules"android:fullBackupContent="@xml/backup_rules"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:supportsRtl="true"android:theme="@style/Theme.Aidl_signal"tools:targetApi="31"><serviceandroid:name=".MyService"android:enabled="true"android:exported="true"></service><activityandroid:name=".MainActivity"android:exported="true"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>
跟前面的本质区别就是几行代码
MyAidlInterface mMyAidlInterface = MyAidlInterface.Stub.asInterface(iBinder);
这行代码是将 IBinder 对象转换为 MyAidlInterface 接口的实例对象。
在 Android 应用程序中,跨进程通信 (IPC) 常常使用 AIDL (Android Interface Definition Language) 来定义接口和方法。当客户端绑定到一个服务时,服务返回一个 IBinder 对象,客户端可以使用它来调用服务中的方法。但是,IBinder 对象并不能直接调用服务中的方法,因为客户端和服务在不同的进程中。因此,需要将 IBinder 对象转换为接口实例对象,以便客户端可以使用接口调用服务中的方法。
在这个例子中,MyAidlInterface 是一个 AIDL 接口,它定义了客户端可以调用的方法。Stub 是 MyAidlInterface 的内部类,它实现了 MyAidlInterface 接口,并提供了 asInterface() 静态方法,用于将 IBinder 对象转换为接口实例对象。
当客户端绑定到服务时,服务返回的 IBinder 对象可以在客户端的 ServiceConnection 实现中获取。然后,客户端可以使用 Stub.asInterface() 方法将 IBinder 对象转换为接口实例对象,以便客户端可以使用接口调用服务中的方法
五.两个APK间通过AIDL进行binder通信
1.server端的代码
一共有一个MyService.java,一个MyInterface.aidl,一个AndroidManifest.xml文件
MyService.java
package com.example.server;import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;public class MyService extends Service {private IBinder mBinder = new MyBinder();public MyService() {}@Overridepublic IBinder onBind(Intent intent) {return mBinder;}private class MyBinder extends MyInterface.Stub {@Overridepublic int add(int a, int b) throws RemoteException {return a + b;}}
}
MyInterface.aidl
// MyInterface.aidl
package com.example.server;// Declare any non-default types here with import statementsinterface MyInterface {/*** Demonstrates some basic types that you can use as parameters* and return values in AIDL.*/int add(int a, int b);
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"><applicationandroid:allowBackup="true"android:dataExtractionRules="@xml/data_extraction_rules"android:fullBackupContent="@xml/backup_rules"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:supportsRtl="true"android:theme="@style/Theme.Server"tools:targetApi="31"><serviceandroid:name=".MyService"android:enabled="true"android:exported="true"><intent-filter><!--添加了一个唯一的action,供客户端隐式启动service--><action android:name="com.example.server.MyService"/></intent-filter></service></application></manifest>
需要注意的是server没有activity,只有service,所以我们在配置工程的时候配置没有activity启动
![](https://img-blog.csdnimg.cn/img_convert/3ad9abad35a37fb03c1be82ea2bb2749.png)
2.client端的代码
客户端只有MainActivity
package com.example.client;import androidx.appcompat.app.AppCompatActivity;import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;import com.example.server.MyInterface;public class MainActivity extends AppCompatActivity {final String TAG = "zhongjun_MainActivity";private MyInterface mMyService;private ServiceConnection mConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName className, IBinder service) {Log.d(TAG, "onServiceConnected");mMyService = MyInterface.Stub.asInterface(service);try {int result = mMyService.add(1, 2);Log.d(TAG, "mMyService.add:" + result);} catch (RemoteException e) {e.printStackTrace();}}@Overridepublic void onServiceDisconnected(ComponentName className) {Log.d(TAG, "onServiceDisconnected");}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Log.d(TAG, "onCreate");Intent intent = new Intent("com.example.server.MyService");intent.setPackage("com.example.server");bindService(intent, mConnection, Context.BIND_AUTO_CREATE);}
}
另外,还需要把server端的aidl copy过来
copy路径为server\app\src\main整个aidl文件夹 放到client\app\src\main下面,工程显示如下:
![](https://img-blog.csdnimg.cn/img_convert/eed4219f4cf28996fd6ad645d267e9d8.png)
相关文章:
![](https://img-blog.csdnimg.cn/img_convert/eed4219f4cf28996fd6ad645d267e9d8.png)
Android binder通信实现进程间通信
一.binder通信原理Binder 是 Android 系统中用于跨进程通信的一种机制,它允许一个进程中的组件与另一个进程中的组件进行通信,从而实现进程间通信 (IPC)。Binder 机制是基于 Linux 内核提供的进程间通信机制 (IPC) 实现的。在 Binder 机制中,…...
![](https://img-blog.csdnimg.cn/9d232644271749c1b45f57c98445f4da.png)
2023年BeijngCrypt勒索病毒家族最新变种之.halo勒索病毒
目录 前言:简介 一、什么是.halo勒索病毒? 二、.halo勒索病毒是如何传播感染的? 三、感染.halo后缀勒索病毒建议立即做以下几件事情 四、中了.halo后缀的勒索病毒文件怎么恢复? 五、加密数据恢复情况 六、系统安全防护措施建…...
![](https://img-blog.csdnimg.cn/5d914fd07e434287821889ac51ee9156.png)
【LeetCode】BM1 反转链表、NC21 链表内指定区间反转
作者:小卢 专栏:《Leetcode》 喜欢的话:世间因为少年的挺身而出,而更加瑰丽。 ——《人民日报》 BM1 反转链表 描述: 给定一个单链表的头结点pHead(该头节点是有值的,…...
![](https://www.ngui.cc/images/no-images.jpg)
拼多多24届暑期实习真题
1. 题目描述: 多多开了一家自助餐厅,为了更好地管理库存,多多君每天需要对之前的课流量数据进行分析,并根据客流量的平均数和中位数来制定合理的备货策略。 2. 输入输出描述: 输入描述: 输入共两行&#x…...
![](https://img-blog.csdnimg.cn/b1657925fb8349d5b1b8abfb15422364.png)
JS高级知识总结
文章目录1. this指向问题2. 对象进阶2.1 对象的定义和使用2.2 对象访问器2.2.1 Getter2.2.2 Setter2.3 对象构造器2.4 对象原型2.4.1 prototype属性2.4.2 \_\_proto\_\_ 属性2.4.3 constructor属性2.4.4 原型链2.5 Object对象2.5.1 管理对象2.5.2 保护对象3. 函数进阶3.1 函数的…...
![](https://img-blog.csdnimg.cn/81660c688d724bd49a180f50dac7f60d.png)
Jenkins+Docker+Maven+gitlab实现自动构建、远程发布
前言 一个项目完整的生命周期是从开发的coding阶段和coding阶段的质量测试,再到多次发布投入使用。目前大部分的测试阶段并不是从coding结束后开始的,而是和coding同步进行的。可能今天早上coding完成一个功能,下午就要投入测试。在这期间&a…...
![](https://img-blog.csdnimg.cn/8f37f97c990e402ca7f6414cbe55b51f.png)
centos7克隆虚拟机完成后的的一些配置介绍
系列文章目录 centos7配置静态网络常见问题归纳_张小鱼༒的博客-CSDN博客 文章目录 目录 系列文章目录 前言 一、配置Hadoop要下载的压缩包 1、下载对应版本的Hadoop压缩包 2、我们如何查看自己电脑的端口号 3、下载jdk对应的版本 二、虚拟机centos7克隆虚拟机完成后的一些基本…...
![](https://img-blog.csdnimg.cn/a7efd4050bfd47ee86154fee1d8305ee.png)
C语言/动态内存管理函数
C程序运行时,内存将被划分为三个区域,而动态开辟的内存区间位于堆区。 文章目录 前言 一、内存划分 二、malloc函数 三、calloc函数 四、realloc函数 五、free函数 总结 前言 在使用C语言编写程序时,使用动态内存是不可避免的&#x…...
![](https://img-blog.csdnimg.cn/931571665af143c8a82e55b0127ddc74.png#pic_center)
华为OD机试题,用 Java 解【任务调度】问题
华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典使用说明 参加华为od机试,一定要注意不要…...
![](https://www.ngui.cc/images/no-images.jpg)
河南农业大学2023春蓝桥杯赛前训练第一场
A 滑板上楼梯 贪心 要求最少次数,尽量多跳三阶的,不能连续跳三阶,三阶后面一定要跟着一个一阶,相当于直接跳四阶 每次跳四阶都是两步(3、1),如果 % 4 之后,正好剩下 3 ,…...
![](https://www.ngui.cc/images/no-images.jpg)
docker-dockerfile
1.常用保留字指令 FROM : 基础镜像MAINTAINER: 维护者姓名和邮箱RUN : Run ["可执行文件",参数1]; Run [shell命令]EXPOSE: 暴露出的端口号WORKDIR: 登录后的位置USER: 执行用户,默认是rootENV: 构建过程的环境变量ADD: 将宿主机的文件拷贝到…...
![](https://img-blog.csdnimg.cn/img_convert/56e05aa45cab48aa8cca2e31564a612f.jpeg)
【JavaEE】浅识进程
一、什么是进程1.1 操作系统学习进程之前首先要了解我们的操作系统(OS),我们的操作系统实际上也是一款软件,属于系统软件的范畴,操作系统早期采用命令提示框与用户交互,我们启动某个软件,打开某…...
![](https://img-blog.csdnimg.cn/ca157bfbc9454e04b1becec54fc15095.png)
Java_Spring:1. Spring 概述
目录 1 spring 是什么 2 Spring 的发展历程 3 spring 的优势 4 spring 的体系结构 1 spring 是什么 Spring 是分层的 Java SE/EE 应用 full-stack 轻量级开源框架,以 IoC(Inverse Of Control:反转控制)和 AOP(Aspec…...
![](https://img-blog.csdnimg.cn/40cb46b038dd44e0939840635149459c.png)
使用Maven实现第一个Servlet程序
目录 前言: Maven 什么是Maven 创建Maven项目 Mevan目录介绍 Servlet程序 引入Servlet依赖 创建目录结构 编写代码 打包程序 部署程序 验证程序 idea集成Tomcat 下载Tomcat插件 配置Tomcat的路径 Smart Tomcat工作原理 小结: 前言&#…...
![](https://img-blog.csdnimg.cn/53e8bd270e9d4903b6a974f91a6999a6.png)
【MySQL】MySQL的优化(一)
目录 查看SQL执行频率 定位低效率执行SQL 定位低效率执行SQL-慢查询日志 定位低效率执行SQL-show processlist 查看SQL执行频率 MySQL 客户端连接成功后,通过 show [session|global] status 命令可以查看服务器状态信息。通 过查看状态信息可以查看对当…...
![](https://img-blog.csdnimg.cn/d6a179cd494e4cde946403fc9d9b284a.png)
win kubernetes dashbord部署springboot服务
文章目录前言一、新建springboot工程二、制作镜像1.编写dockerfile2.使用阿里云镜像仓库3.使用dashbord部署服务总结前言 使用win版docker desktop安装的k8s,kubenetes dashbord。 一、新建springboot工程 就是简单一个接口。没什么说的 二、制作镜像 1.编写dock…...
![](https://img-blog.csdnimg.cn/f5dfaa6439604a5397b2fd493cc037ac.png)
Linux之进程终止
本节目录1.进程终止2.exit与_exit函数1.进程终止 进程终止时,操作系统做了什么? 释放进程中申请的相关内核数据结构和对应的数据和代码。本质就是释放系统资源。 进程终止的常见方式 a.代码跑完,结果正确 b.代码跑完,结果不正确…...
![](https://img-blog.csdnimg.cn/3ab2acb883ac4ae1a1df9d4b6f305817.png)
全网独家首发|极致版YOLOv7改进大提升(推荐)网络配置文件仅24层!更清晰更方便更快的改进YOLOv7网络模型
有不少小伙伴和我交流YOLO改进的时候,都说YOLOv7的网络配置文件长达104层,改起来很费力,数层数都要数很久,还很容易出错,而且基于YOLOv5代码架构,Debug起来也确实比较费时,所以博主对YOLOv7网络…...
![](https://img-blog.csdnimg.cn/e08c2cde795e41f7b9adef8a8156eaf8.png)
C++入门 谁都能看懂的类和对象
类 C语言结构体中只能定义变量. 在C中,结构体内不仅可以定义变量,也可以定义函数。 //c语言 typedef struct ListNode {int val;struct ListNode* next; }LTN; //c struct ListNode {int val;//c中可以直接用这个,不用加structListNode* next…...
![](https://img-blog.csdnimg.cn/e716edc0965e4494a8c67f940baa210b.png)
C++ STL:string类的模拟实现
目录 前置说明 一. 构造函数和析构函数的模拟实现 1.1 构造函数 1.2 析构函数 二. string类对象容量及成员相关的函数 2.1 获取字符串有效字符数、容量及_str成员变量获取相关函数 2.2 扩容及变长相关函数 2.3 字符串清空和判空函数 三. 运算符重载函数 3.1 赋值运算…...
![](https://img-blog.csdnimg.cn/324013a192744744a2b1902d84223369.png)
并发编程---线程池(六)
阻塞队列的应⽤——线程池一 线程池基本概念二 线程池三种常⽤创建⽅式2.1.newFixedThreadPool线程池:2.2.newSingleThreadExecutor线程池:2.3.newCachedThreadPool线程池:2.4. 线程池代码演示三 线程池创建的七个参数四 线程池底层原理理解&…...
![](https://www.ngui.cc/images/no-images.jpg)
【Java实战】不会还有人用if else进行参数校验吧
当请求参数很多,几乎每一个参数都需要后端去兜底校验时,你还在写if else去判断参数是否为空吗??要校验为空的参数三四个还好,要是十几个,业务逻辑还没开始就写二三十行代码开始堆山了嘛,教给大家…...
![](https://www.ngui.cc/images/no-images.jpg)
深度学习部署(十六): CUDA RunTime API _vector-add 使用cuda核函数实现向量加法
1. 知识点 nthreads的取值,不能大于block能取值的最大值。一般可以直接给512、256,性能就是比较不错的 (input_size block_size - 1) / block_size;是向上取整 对于一维数组时,采用只定义layout的x维度,若处理的是二维ÿ…...
![](https://www.ngui.cc/images/no-images.jpg)
堆结构的两个应用
堆排序 堆结构很大的一个用处,就是用于堆排序了,堆排序的时间复杂度是O(n∗log2n)O(n*log_2n)O(n∗log2n)量级的,在众多排序算法中所处的地位也是高手级别的了。 但很多人在使用堆排序的时候,首先认为我必须得有一个堆数据结构…...
![](https://www.ngui.cc/images/no-images.jpg)
Java中的 static
1 static 静态变量 1.1 静态变量的使用 static变量也称作静态变量,也叫做类变量 静态变量被所有的对象所共享,在内存中只有一个副本 当且仅当在类初次加载时会被初始化 静态变量属于类 通过类名就可以直接调用静态变量 也可以通过对象名.静态变量…...
![](https://img-blog.csdnimg.cn/img_convert/9b3993e303c7d53528e17086aae89a7f.png)
基于Vision Transformer的图像去雾算法研究与实现(附源码)
基于Vision Transformer的图像去雾算法研究与实现 0. 服务器性能简单监控 \LOG_USE_CPU_MEMORY\文件夹下的use_memory.py文件可以实时输出CPU使用率以及内存使用率,配合nvidia-smi监控GPU使用率 可以了解服务器性能是否足够;运行时在哪一步使用率突然…...
![](https://www.ngui.cc/images/no-images.jpg)
服务器相关常用的命令
cshell语法 https://www.doc88.com/p-4985161471426.html domainname命令 1)查看当前系统域名 domainname2)设置并查看当前系统域名 domainname example.com3)显示主机ip地址 domainname -Iwhich命令 which 系统命令在 PATH 变量指定的…...
![](https://img-blog.csdnimg.cn/e4f1e9ef7d8a49d5801a64efd9f19c6b.png)
今天是国际数学日,既是爱因斯坦的生日又是霍金的忌日
目录 一、库函数计算 π 二、近似值计算 π 三、无穷级数计算 π 四、割圆术计算 π 五、蒙特卡罗法计算 π 六、计算800位精确值 从2020年开始,每年的3月14日又被定为国际数学日,是2019年11月26日联合国教科文组织第四十届大会上正式宣布…...
![](https://img-blog.csdnimg.cn/85e8d8f7d9e34881a69541c70a6fd308.png)
Qt Quick - StackLayout 堆布局
StackLayout 堆布局一、概述二、attached 属性三、例子1. 按钮切换 StackLayout 页面一、概述 StackLayout 其实就是说,在同一个时刻里面,只有一个页面是展示出来的,类似QStackWidget 的功能,主要就是切换界面的功能。这个类型我…...
![](https://img-blog.csdnimg.cn/img_convert/5f8621809e2c57b2df7f8c1e937aa3e1.png)
C/C++网络编程笔记Socket
https://www.bilibili.com/video/BV11Z4y157RY/?vd_sourced0030c72c95e04a14c5614c1c0e6159b上面链接是B站的博主教程,源代码来自上面视频,侵删,这里只是做笔记,以供复习和分享。上一篇博客我记录了配置环境并且跑通了࿰…...
![](http://reinember.blog.51cto.com/attachment/201308/7/2919431_1375847836OcLd.png)
客户管理系统网站/百度云网盘资源链接
在前面的文章中,我们部署好了SMB共享存储,那么我们应该如何让Hyper-V主机使用SMB共享存储,用作虚拟机磁盘文件、虚拟机文件等的存放。其实我们在添加Hyper-V角色的时候就可以设置虚拟机文件、虚拟机磁盘的存储位置。在我们添加角色时…...
![](/images/no-images.jpg)
专业网站建设模板下载/郑州官网网站推广优化
题目:指针 与 引用的区别 (1)指针是变量的地址,引用是变量的别名。 (2)sizeof运算符的运算结果不同,对于指针运算是指针大小(4/8),对于引用运算是取决于原变…...
![](http://47.112.100.1/images/weixin.png)
太原做网站的工作室/全国最新的疫情数据
再起步 前面已经用了两个篇幅取描述复合类型,已经把复合类型的基本概念和重要知识点以及元组、列表都描述的很清楚了,核心基本都已经掌握。就还剩下字典和集合,本章就讲讲这两个玩意。 话不多说,直接上菜。我认为字典就类似于南方…...
![](/images/no-images.jpg)
太原手手工网站建设公司/关键词排名推广方法
jsp页面获取数据,感觉最方便的就是使用jstlEL了,各种封装好的函数非常简单易用,接下来写如何使用jstl: 1、下载jstl-1.2_1.jar 2、由于项目是: xmlns"http://java.sun.com/xml/ns/javaee" xmlns:web"ht…...
![](https://img-blog.csdnimg.cn/img_convert/e1da349ef12a7523320a83e1c932e687.png)
网站建设工作是干什么的/如何优化企业网站
Android开发真的凉了吗? 经常有朋友问我:“现在学习Android开发还有前景吗?”“Android开发还有什么可以研究的?”大家对于职业的未来,都有一些迷茫和焦虑,其实我也有,为什么会这样呢ÿ…...
![](https://img-blog.csdnimg.cn/727b76bc1bc944bcae264de9fc18f2a3.png)
中等职业学校示范建设专题网站/市场调查报告模板及范文
原由 1.我有一个socket服务,用ip访问是成功的,但是老板说用这个不行,要用nginx请求转发,转发内网地址到某个域名 2.但是我改成了指定域名后失败,因为我没有配置nginx.conf 3.接下来一起学习下,怎么在ngin…...