E-COM-NET
首页
在线工具
Layui镜像站
SUI文档
联系我们
自带buff
netty源码解解析(4.0)-6 线程模型-IO线程EventLoopGroup和NIO实现(一)
接口定义
io.netty.channel.EventLoopGroup extends EventExecutorGroup
方法
说明
ChannelFuture register(Channel channel)
把一个channel注册到一个EventLoop
ChannelFuture register(Channel channel, ChannelPromise promise);
同上
io.netty.channel.EventLoop extends OrderedEventExecutor, EventLoopGroup
方法
说明
EventLoopGroup parent()
得到创建这个eventLoop的EventLoopGroup
EventLoopGroup定义的主要方法是register, 这个方法的语义是把channel和eventLoop绑定在一起。一个channel对应一个eventLoop, 一个eventLoop会持有多个channel。
I/O线程EventLoopGroup的抽象实现
io.netty.channel.MultithreadEventLoopGroup extends MultithreadEventExecutorGroup implements EventLoopGroup
io.netty.channel.SingleThreadEventLoop extends SingleThreadEventExecutor implements EventLoop
两个类主功能都是实现了EventLoopGroup定义的register方法
MultithreadEventLoopGroup
public ChannelFuture register(Channel channel) {
return next().register(channel);
}
public ChannelFuture register(Channel channel, ChannelPromise promise) {
return next().register(channel, promise);
}
SingleThreadEventLoop
public ChannelFuture register(Channel channel) {
return register(channel, new DefaultChannelPromise(channel, this));
}
public ChannelFuture register(final Channel channel, final ChannelPromise promise) {
channel.unsafe().register(this, promise);
return promise;
}
register的实现主要是为了调用Channel.Unsafe实例的register方法。
NIO实现
io.netty.channel.nio.NioEventLoopGroup extends MultithreadEventLoopGroup
io.netty.channel.nio.NioEventLoop extends SingleThreadEventLoop
NioEventLoopGroup是在MultithreadEventLoopGroup基础上实现了对JDK NIO Selector的封装, 它实现以下几个功能:
创建selector
在selector上注册channel感兴趣的NIO事件
实现EventExecutor的run方法,定义NIO事件和Executor任务的处理流程。
把NIO事件转换成对channel unsafe的调用或NioTask的调用
控制线程执行I/O操作和排队任务的用时比例
处理epoll selector cpu 100%的bug
下面来具体分析这几个功能的实现。
创建Selector
NioEventLoop#openSelector()实现了创建selector的功能,默认情况下,使用SelectorProvider#openSelector()方法创建一个新个selector:
final Selector unwrappedSelector = provider.openSelector();
如果设置环境变量io.netty.noKeySetOptimization=true, 会创建一个selectedKeySet = new SelectedSelectionKeySet(), 然后使用java的反射机制把selector的selectedKeys和publicSelectedKeys替换成selectedKeySet,具体步骤是:
1.得到selector的真正类型: sun.nio.ch.SelectorImpl
Object maybeSelectorImplClass = AccessController.doPrivileged(new PrivilegedAction
() {
@Override
public Object run() {
try {
return Class.forName(
"
sun.nio.ch.SelectorImpl
",
false,
PlatformDependent.getSystemClassLoader());
} catch (Throwable cause) {
return cause;
}
}
});
final Class selectorImplClass = (Class) maybeSelectorImplClass;
2.替换selector是属性unwrappedSelector
Field selectedKeysField = selectorImplClass.getDeclaredField("
selectedKeys
");
Field publicSelectedKeysField = selectorImplClass.getDeclaredField("
publicSelectedKeys
");
selectedKeysField.set(unwrappedSelector, selectedKeySet);
publicSelectedKeysField.set(unwrappedSelector, selectedKeySet);
之所以会设计一个这样的优化选项,是因为一般情况下调用完selector的select或selectNow方法后需要调用Selector#selectedKeys()得到触发NIO事件的的SelectableChannel,这样优化之后,可以直接从selectedKeySet中得到已经触发了NIO事件的SelectableChannel。
在selector上注册channel感兴趣的NIO事件
NioEventLoop提供了unwrappedSelector方法,这个方法返回了它创建好的Selector实例。这样任何的外部类都可以把任意的SelectableChannel注册到这selector上。在AbstractNioChannel中, doRegister方法的实现就是使用了这个方法:
selectionKey = javaChannel().register(eventLoop().unwrappedSelector(), 0, this);
另外,它还提供了一个register方法:
public void register(final SelectableChannel ch, final int interestOps, final NioTask task)
这个方法会把task当成SelectableChannel的附件注册到selector上:
ch.register(selector, interestOps, task);
实现EventExecutor的run方法,定义NIO事件和Executor任务的处理流程
在NioEventLoop的run方法中实现NIO事件和EventExecutor的任务处理逻辑,这个run方法在io.netty.util.concurrent.SingleThreadEventExecutor中定义。在上一章中,我们看到了DefaultEventExecutor中是如何实现这个run方法的,这里我们将要看到这run方法的另一个实现。和SingleThreadEventExecutor中的run方法相比,NioEventLoop的run方法不仅要及时地执行taskQueue中的任务,还要能及时地处理NIO事件,因此它会同时检查selector中的NIO事件和和taskQueue队列,任何一个中有事件需要处理或有任务需要执行,它不会阻塞线程。同时它也保证了在没有NIO事件和任务的情况下线程不会无谓的空转浪费CUP资源。
run主要实现如下,为了更清晰的说明它的主要功能,我对原来的代码进行了一些删减。
for(;;){
try{
/
/phase1: 同时检查NIO事件和任务
switch (selectStrategy.calculateStrategy(selectNowSupplier, hasTasks())) {
case SelectStrategy.CONTINUE:
continue;
case SelectStrategy.SELECT:
select(wakenUp.getAndSet(false)); //
在taskQueue中没有任务的时候执行select
}
//
phase2: 进入处理NIO事件,执行executor任务
try{
//
处理NIO事件
processSelectedKeys();
}finally{
//
处理taskQueu中的任务
runAllTasks();
}
}catch(Throwable t){
handleLoopException(t);
}
}
run方法有两个阶段构成:
phase1: 检查NIO事件或executor任务,如果有任何的NIO事件或executor任务进入phase2。
这样阶段的主要工作在selectStrategy.calculateStrategy(selectNowSupplier, hasTasks())和select中完成。
selectStrategy.calculateStrategy实现
selectStrategy.calculateStrategy(selectNowSupplier, hasTasks())
这行代码的含义是: 如果hasTasks() == true, 调用以下selector#selectNow, 然后进入phase2。 否则调用select。这里使用了strategy模式,默认的strategy实现是io.netty.channe.DefaultSelectStrategy implements SelectStrategy
@Override
public int calculateStrategy(IntSupplier selectSupplier, boolean hasTasks) throws Exception {
return hasTasks ? selectSupplier.get() : SelectStrategy.SELECT;
}
DefaultSelectStrategy实现了SelectStrategy接口,这接口定义了两个常量:
int SELECT = -1;
int CONTINUE = -2;
运行时selectSuppler参数传入的是selectNowSupplier, 它的实现如下:
private final IntSupplier selectNowSupplier = new IntSupplier() {
@Override
public int get() throws Exception {
return selectNow();
}
};
这里的get方法调用了selectNow, selectNow调用的是Selector#selectNew方法,这个方法的返回值是>=0。
hashTasks的传入的参数是hasTask()的返回值: return !taskQueue.isEmpty();
代码读到这里就会发现,使用默认的的SelectStrategy实现,calculateStrategy在hasTasks()==true时返回值>=0, hasTasks() == false时返回值是SelectStrategy.SELECT,不会返回SelectStrategy.CONTINUE。
select实现
select的执行逻辑是:
1. 计算超select方法的结束时间selectDeadLineNanos
long currentTimeNanos = System.nanoTime();
long selectDeadLineNanos = currentTimeNanos + delayNanos(currentTimeNanos);
2. 进入循环,检查超时--超时跳出循环。
long timeoutMillis = (selectDeadLineNanos - currentTimeNanos + 500000L) / 1000000L;
if (timeoutMillis <= 0) {
if (selectCnt == 0) {
selector.selectNow();
selectCnt = 1;
}
break;
}
3. 如果在select执行过程中有executor任务提交或可以当前的wakeUp由false变成true, 跳出循环
if (hasTasks() && wakenUp.compareAndSet(false, true)) {
selector.selectNow();
selectCnt = 1;
break;
}
4. 调用selector#select等待NIO事件。
int selectedKeys = selector.select(timeoutMillis);
selectCnt ++;
5. 如果满足这些条件的任何一个,跳出循环: 有NIO事件、wakeUp的新旧值都是true、taskQueue中有任务、有定时任务到期。
if (selectedKeys != 0 || oldWakenUp || wakenUp.get() || hasTasks() || hasScheduledTasks()) {
break;
}
6. 如果线程被中断,跳出循环。
if (Thread.interrupted()) {
break;
}
7. 如果selector.select超时,没有检查到任何NIO事件, 会在下次循环开始时跳出循环。 如果每次超时,跳到第2步继续下一次循环。
long time = System.nanoTime();
if (time - TimeUnit.MILLISECONDS.toNanos(timeoutMillis) >= currentTimeNanos) {
selectCnt = 1;
}
currentTimeNanos = time;
select 最迟会在当前时间>= selectDeadLineNanos时返回,这个时间是最近一个到期的定时任务执行的时间,换言之如果没有任何的NIO事件或executor任务,select会在定时任务到期时返回。如果没有定时任务,delayNanos(currentTimeNanos)返回的值是 TimeUnit.SECONDS.toNanos(1),即1秒。 select会在检查到任何NIO事件或executor任务时返回,为了保证这点,在selector.select(timeoutMillis)前后都会调用hasTasks检查executor任务,为了能在调用executet提交任务时唤醒selector.select,NioEventLoop覆盖了SingleThreadEventExecutor的wake方法:
protected void wakeup(boolean inEventLoop) {
if (!inEventLoop && wakenUp.compareAndSet(false, true)) {
selector.wakeup();
}
}
这个方法会及时的唤醒selector.select, 保证新提交的任务可以得到及时的执行。
phase2: 进入处理NIO事件,执行executor任务
这个阶段是先调用processSelectedKeys()处理NIO事件,然后掉用 runAllTasks()处理所有已经到期的定时任务和已经在排队的任务。这个阶段还实现了NIO事件和executor任务的用时比例管理,这个特性稍后会详细分析。
你可能感兴趣的:(netty源码解解析(4.0)-6 线程模型-IO线程EventLoopGroup和NIO实现(一))
存贮论模型案例与Matlab实现
青橘MATLAB学习
matlab
算法
开发语言
摘要:本文结合存贮论确定性模型,详细解析经济订购批量(EOQ)、允许缺货生产批量等核心模型,并通过商品库存管理、生产计划等实际案例,配合Matlab代码实现,展示模型求解过程。涵盖公式推导、参数优化及结果分析,强调数学工具在库存决策中的应用价值。关键词:存贮论EOQ模型允许缺货Matlab实现费用优化1.模型一:EOQ模型(不允许缺货,瞬时补货)案例描述某超市销售某品牌饮料,年需求量为10,000
网络安全员证书
黑客KKKing
计算机
网络安全
网络工程师
web安全
网络
安全
软考网络安全员证书:信息安全领域的黄金标准随着信息技术的飞速发展,网络安全问题日益凸显,网络安全员的需求也日益增加。软考网络安全员证书作为信息安全领域的黄金标准,对于网络安全从业者来说具有重要意义。本文将详细介绍软考网络安全员证书的背景和意义、获得要求、价值以及备考建议,为有意向参加软考网络安全员证书考试的人员提供参考。一、引言随着网络攻击和数据泄露事件的频繁发生,企业对网络安全人才的需求不断增长
使用深度学习模型U-Net进行训练基于哨兵2的作物分割数据集。PyTorch框架为例,如何构建和训练U-Net模型来完成基于哨兵2的作物分割检测
计算机C9硕士_算法工程师
分割数据
深度学习
pytorch
人工智能
使用深度学习模型如U-Net进行训练基于哨兵2的作物分割。PyTorch框架为例,如何构建和训练U-Net模型来完成基于哨兵2的作物分割检测基于哨兵2的作物分割,共18种作物类型(背景,草地,软冬小麦,玉米,冬季大麦,冬季油菜,春季大麦,向日葵,葡萄藤,甜菜,冬季小黑麦,冬季硬质小麦,水果、蔬菜、花卉,土豆,豆科饲料,大豆,果园,混合谷物,高粱),38到61个不同时间段同一位置10通道多光谱图像,
探秘Java动态追踪技术:如何在不停服的情况下调试和优化你的应用程序
墨夶
Java学习资料1
java
单元测试
在现代软件开发的世界里,快速迭代和持续交付成为了常态。然而,在生产环境中遇到问题时,传统的调试方法往往显得力不从心——重启服务可能会带来不可接受的服务中断风险。这时,Java动态追踪技术就展现出了它的价值。它允许开发者在不影响现有业务的前提下,实时地对正在运行的应用程序进行监控、诊断甚至修改。本文将深入探讨这一强大的工具集,并通过实际案例展示其应用。一、什么是Java动态追踪?简单来说,Java动
全网刷屏的AI大模型进阶地图:3个月构建核心能力,淘汰90%同行
大模型入门教程
人工智能
AI大模型
大模型
AI
大模型学习
大模型入门
大模型教程
23年AI大模型技术狂飙一年后,24年AI大模型的应用已经在爆发,因此掌握好AI大模型的应用开发技术就变成如此重要,那么如何才能更好地掌握呢?一份AI大模型详细的学习路线就变得非常重要!由于AI大模型应用技术比较新,业界也没什么参照标准,打造AI大模型技术的学习路线并非一件容易的事,我和团队花费了6个多月时间,边整理、边摸索、边实践打造了业界首份AI大模型学习路线。这份完整的AI大模型学习路线,都
Java大作业——酒店管理系统(六):客户管理【完结】
二年级程序员
java
课程设计
开发语言
Java大作业(一)介绍了全部功能点一、Main类——用于启动整个程序......代码于Java大作业(二)二、LoginWindowWindow类——用于登录......代码于Java大作业(二)三、FunctionSelectionWindow类——用于选择对应的功能......代码于Java大作业(二)四、AccountManagementWindow类——用于管理酒店工作人员账户.....
简单爬取一下电影排行
孟婆来包棒棒糖~
数据库
python
爬虫
主要用到了requests和xpath来解析数据,然后储存在mysql数据库中,不过代码方面我是先写好简单实现工作,然后让ai帮我用类封装来成功实现,博主比较菜,如果有反爬措施可以找js逆向视频来学习importrequestsfromfake_useragentimportUserAgentfromlxmlimportetreeimportpymysqlfrompymysql.cursorsim
昆仑通态-数据显示
创益无界
工业控制分享
数据库
我遇到一个问题,在上位机界面给设备设参数时,某一个参数的值大于一个常数时给不下去,我检查了数据类型没有问题,我在显示界面打开参数的属性设置面板,最大值设置没有问题。后发现在实时数据库对数据范围也做了限制昆仑通态有两个数据库:分别是设备窗口的数据库和实时数据库。设备窗口的数据库可以添加多个设备分别存储数据,对数据类型、数据长度等自由定义;实时数据库存储所有的数据,确保数据共享。设备窗口的数据库数据存
51单片机学习-流水灯(keil与Proteus)
创益无界
嵌入式学习
51单片机
嵌入式硬件
单片机
学习
一、跑马灯(keil)1.硬件接线原理图(1)、89C52(2)、流水灯2、keil代码#include//包含51头文件#include//包含移位标准库函数头文件#defineuintunsignedint#defineucharunsignedcharuchartemp;//LED灯相关变量voiddelay(uintz){uintx,y;for(x=z;x>0;x--)for(y=114;
【Burp入门第三十六篇】加解密实现短信轰炸实战案例
秋说
Burp
漏洞挖掘
BurpSuite是一款功能强大的渗透测试工具,被广泛应用于Web应用程序的安全测试和漏洞挖掘中。本专栏将结合实操及具体案例,带领读者入门、掌握这款漏洞挖掘利器读者可订阅专栏:【Burp由入门到精通|CSDN秋说】文章目录背景加解密短信轰炸背景在针对目标应用程序的测试中,发现其密码找回功能存在请求加密机制,具体表现为用户通过手机号获取验证码的请求数据包采用了加密传输:加解密通
【Burp入门第三十三篇】BurpSuite+Proxifier安装配置,实现微信小程序抓包
秋说
BurpSuite
渗透工具
Proxifier
BurpSuite是一款功能强大的渗透测试工具,被广泛应用于Web应用程序的安全测试和漏洞挖掘中。本专栏将结合实操及具体案例,带领读者入门、掌握这款漏洞挖掘利器读者可订阅专栏:【Burp由入门到精通|CSDN秋说】文章目录下载配置下载汉化版下载地址:https://get-shell.com/1506.html#hidden-box-comment解压后双击exe文件:
【网络安全 | 扫描子域+发现真实IP】CloakQuest3r安装使用详细教程
秋说
网安渗透工具使用教程(全)
web安全
子域名扫描
渗透工具
原创文章,禁止转载。本文仅作学习交流使用,不得用于非法渗透,笔者不承担任何责任。文章目录简介功能介绍执行流程限制安装步骤可选功能:SecurityTrailsAPI使用示例简介CloakQuest3r是一款强大的Python工具,专为揭示受Cloudflare及类似服务保护的网站真实IP地址而设计。Cloudflare作为广泛应用的Web安全与性能优化服务,其防护机制可隐藏网站的实际IP,而Clo
java:Apache Commons Configuration2占位符解析异常的正确解法:${prefix:name:-default}
10km
java
java
apache
configuration2
变量插值
Interpolation
问题重现在之前的博文《spring-boot:apachecommons-configuration2异常:java.lang.IllegalArgumentException:name原因分析》中,我们曾遇到SpringBootFat-Jar运行时因LaunchedURLClassLoader资源加载异常导致的启动失败问题。当时的解决方案是通过预创建空配置文件来规避异常1://旧方案:手动创建空
C# 牵手DeepSeek:打造本地AI超能力
步、步、为营
c#
人工智能
开发语言
一、引言在人工智能飞速发展的当下,大语言模型如DeepSeek正掀起新一轮的技术变革浪潮,为自然语言处理领域带来了诸多创新应用。随着数据隐私和安全意识的提升,以及对模型部署灵活性的追求,本地部署DeepSeek成为众多开发者和企业关注的焦点。对于C#开发者而言,将DeepSeek模型本地部署并集成到C#项目中,不仅能充分发挥C#语言在Windows平台开发的优势,还能实现高度定制化的人工智能应用,
小程序性能优化-预加载
爱分享的程序员
微信小程序
小程序
性能优化
在微信小程序中,数据预加载是提升用户体验的重要优化手段。以下是处理数据预加载的完整方案:一、预加载的适用场景跳转页面前的数据准备如从列表页进入详情页前,提前加载详情数据首屏加载后的空闲时间在首页加载完成后,预加载其他高频页面数据多步骤流程的后续步骤如电商下单流程中,提前加载支付页面所需数据二、核心实现方案1.全局预加载(App级别)//app.jsApp({globalData:{preloadD
【由技及道】模块化战争与和平-论项目结构的哲学思辨【人工智智障AI2077的开发日志】
Yuanymoon
人工智障2077系列
容器化开发
Java
java
开发语言
容器
spring
spring
boot
需求分析:碳基生物的架构困境主人の抽象指令“主人说要写个软件,就像说’给我建个城市’一样轻松呢(程序性微笑)”“一个软件?那就是…一个能无限扩展的企业级开发框架,要支持单体/分布式灵活切换,要能适配未来30年的技术演进,最好明天就能上线”(系统翻译:需要可维护、可扩展、可复用的企业级框架,具备技术无关性设计)智障の内心OS“您怎么不说要一个能自动生成需求的AI呢?哦对…我就是那个AI(苦涩)”人类
Pulsar官方文档学习笔记——架构概览
咚伢
学习
笔记
架构
云原生
zookeeper
分布式
架构概览在最高配置下,pulsar服务应该由一个或多个pulsar集群组成。一个pulsar集群可以包括如下组件一个或多个broker。broker会将生产者的消息分派给消费者。与pulsar配置存储通信来协调各种任务。将消息存储在BookKeeper实例中(也可以叫bookie)。并且依赖zk集群执行一些特定的任务一个BookKeeper集群,由多个bookies组成。可以持久化消息(企业级分布
介绍下你们电商搜索的整体Java技术架构?
java1234_小锋
java
java
大家好,我是锋哥。今天分享关于【介绍下你们电商搜索的整体Java技术架构?】面试题。希望对大家有帮助;介绍下你们电商搜索的整体Java技术架构?1000道互联网大厂Java工程师精选面试题-Java资源分享网在电商平台的搜索系统中,Java技术架构通常是构建高性能、可扩展、稳定搜索引擎的核心。一个典型的电商搜索系统通常会涉及以下几个关键部分:数据采集、索引建立、搜索查询处理、缓存和分布式处理等。下
Github-介绍
创益无界
嵌入式学习
github
GitHub是一个基于Git版本控制系统的代码托管平台,广泛用于开源项目、团队协作、代码管理等方面。它让开发者能够上传、分享、修改、协作、跟踪代码的更改。1.GitHub的基本功能:代码托管:GitHub提供云端存储代码的功能,可以方便开发者上传、下载和管理自己的代码。版本控制:通过Git进行版本管理,每次提交(commit)都会记录下代码的历史,方便回溯和协作。协作与分支管理:可以创建分支,开发
maven:Maven插件开发实践:动态依赖注入与架构演进说明
10km
java
maven
java
plugin
artifact
最近的工作中设计了一个maven插件,需要在插件执行时的增加新的依赖库,本文作为总结,说明如何在插件执行时自主注入新的依赖库。动态依赖注入实现示例解析通过ExampleMojo插件,我们可以在编译阶段动态注入指定的依赖:publicvoidexecute()throwsMojoExecutionException{ArtifactSupport.injectCacheEngine(project,
【网络安全 | 渗透工具】小程序反编译分析源码 | 图文教程
秋说
网安渗透工具使用教程(全)
web安全
漏洞挖掘
小程序
未经许可,禁止转载。本文仅供学习使用,严禁用于非法渗透测试,笔者不承担任何责任。文章目录1、下载Proxifier2、下载反编译工具unveilr3、寻找小程序文件包4、对文件包进行反编译5、对源码进行分析6、渗透思路6.1、查找敏感信息泄露6.2、解析加解密逻辑6.3、枚举API接口并测试反编译是通过逆向工程将小程序包还原为接近源代码的形式。这一过程能够帮助我们提取大量有价值的信息,从而辅助漏洞
量化投资策略的生命周期:从设计到淘汰
云策量化
量化投资
自动化交易
程序化炒股
量化
炒股
miniQMT
量化交易
QMT
量化投资
deepseek
推荐阅读:《程序化炒股:如何申请官方交易接口权限?散户可以申请吗?》量化投资策略的生命周期:从设计到淘汰量化投资,这个听起来既神秘又充满科技感的领域,其实离我们并不遥远。它就像是金融市场中的“算法猎人”,通过数学模型和计算机程序来寻找投资机会。那么,一个量化投资策略是如何从无到有,再到最终被淘汰的呢?让我们一起探索这个策略的生命周期。1.策略的诞生:设计阶段1.1灵感的火花量化投资策略的诞生往往始
Windows 11 新增功能全解析:特性、使用与注意事项
xueyunshengling
微软精华知识宝箱
微软合作伙伴计划
windows
系统功能
Win11
Windows11新增功能
自Windows11发布以来,其一系列令人耳目一新的新增功能便吸引了众多用户的目光。相较于以往的Windows版本,Windows11在界面设计、性能优化以及功能拓展等方面均实现了重大变革。今天,就让我们一同深入探究Windows11的新增功能,详细了解它们的特性、使用方法以及使用过程中需要留意的事项。一、焕然一新的开始菜单与任务栏(一)功能特性居中布局设计:Windows11的开始菜单和任务栏默
Grails+Spring Security 所遇到的几个问题(1)
xplidelphi
Grails
spring
grails
java
安全是每个实际的应用所必需面对的问题。但是,安全是个技术活,没有相当的功底是搞不定的。况且,DRY(don'trepeatyourself)一直是我们的信条。所以,SpringSecurity成了一个非常不错的选项。Grails约定优先的策略能够带来很大的便利,于是,两者的结合就是顺理成章的事情。网上相关的帖子很多,经测试,总结下来是这样几个步骤。创建Grailsig程序不多赘述。以下的步骤是在程
【Java基础】Java 中 的`final` 关键字
李少兄
Java
java
开发语言
前言在Java编程的世界里,final关键字是一个强大且常用的工具。它可以应用于类、方法和变量,赋予它们不同的“不可变”特性。一、final修饰类1.定义与特性当使用final修饰一个类时,这个类就如同被上了一把坚固的锁,不能被其他类继承,即不会有子类。这是Java语言精心设计的一种机制,目的是确保类的设计和实现不会被意外修改,从而保证类的行为和功能始终保持一致。2.示例代码//定义一个final
【Java基础】Java 中的枚举类
李少兄
Java
java
python
数据库
一、前言在Java编程中,枚举类(enum)是一个非常实用且强大的特性,自Java5引入以来,它为开发者提供了一种优雅的方式来表示一组固定的常量。枚举类主要用于信息标志和分类,能显著提升代码的可读性、可维护性和安全性。二、枚举类基础概念(一)枚举类的定义枚举类使用enum关键字来定义,它是一种特殊的类,用于封装一组固定的常量。以下是一个简单的示例:enumSeason{SPRING,SUMMER,
23道 K8S 面试题
奋斗喝咖啡
docker
kubernetes
容器
1、k8s是什么?请说出你的了解?答:Kubernetes是一个针对容器应用,进行自动部署,弹性伸缩和管理的开源系统。主要功能是生产环境中的容器编排。K8S是Google公司推出的,它来源于由Google公司内部使用了15年的Borg系统,集结了Borg的精华。2、K8s架构的组成是什么?答:和大多数分布式系统一样,K8S集群至少需要一个主节点(Master)和多个计算节点(Node)。主节点主要
Vue模板语法(插值语法,指令语法)
仰望天空的小小蜗牛
Vue.js
vue.js
javascript
前端
Vue模板语法有2大类:Vue官网链接1.插值语法:功能:用于解析标签体内容。写法:{{xxx}},xxx是js表达式,且可以直接读取到data中的所有属性。2.指令语法:功能:用于解析标签(包括:标签属性、标签体内容、绑定事件…)。举例:v-bind:href=“xxx”或简写为:href=“xxx”,xxx同样要写js表达式,且可以直接读取到data中的所有属性。备注:Vue中有很多的指令,且
当我删除word文件时无法删除,提示:操作无法完成,因为已在Microsoft Word中打开
阿杜x
Word
word
现象:查看电脑桌面下方的任务栏,明明已经关闭了WPS和WORD软件,但是打开word文档时还是提示:解决方法步骤:1、按一下键盘上的ctrl+Shift+Esc键打开任务管理器2、在进程中找到如下:快速找到的方法:点击进程界面中最上方的一个进程,然后把自己的电脑输入法切换为英文,然后,每按1️⃣次该进程名称开头字母M,就会跳转1次并找到下一个M开头的进程,直到找到如下进程:3、鼠标放在此进程上,右
前端21:Vue.js开发实践指南
mater lai
本文还有配套的精品资源,点击获取简介:Vue.js是前端开发领域流行的JavaScript框架,"前端21"项目展示了基于Vue.js的Web应用程序开发。本文详细介绍了Vue.js的核心概念、项目设置、npm脚本、自定义配置、文件结构、开发过程和VueCLI工具,以帮助开发者高效构建Web应用。1.Vue.js框架基础1.1Vue.js简介Vue.js是一套构建用户界面的渐进式JavaScrip
HQL之投影查询
归来朝歌
HQL
Hibernate
查询语句
投影查询
在HQL查询中,常常面临这样一个场景,对于多表查询,是要将一个表的对象查出来还是要只需要每个表中的几个字段,最后放在一起显示? 针对上面的场景,如果需要将一个对象查出来: HQL语句写“from 对象”即可 Session session = HibernateUtil.openSession();
Spring整合redis
bylijinnan
redis
pom.xml <dependencies> <!-- Spring Data - Redis Library --> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redi
org.hibernate.NonUniqueResultException: query did not return a unique result: 2
0624chenhong
Hibernate
参考:http://blog.csdn.net/qingfeilee/article/details/7052736 org.hibernate.NonUniqueResultException: query did not return a unique result: 2 在项目中出现了org.hiber
android动画效果
不懂事的小屁孩
android动画
前几天弄alertdialog和popupwindow的时候,用到了android的动画效果,今天专门研究了一下关于android的动画效果,列出来,方便以后使用。 Android 平台提供了两类动画。 一类是Tween动画,就是对场景里的对象不断的进行图像变化来产生动画效果(旋转、平移、放缩和渐变)。 第二类就是 Frame动画,即顺序的播放事先做好的图像,与gif图片原理类似。
js delete 删除机理以及它的内存泄露问题的解决方案
换个号韩国红果果
JavaScript
delete删除属性时只是解除了属性与对象的绑定,故当属性值为一个对象时,删除时会造成内存泄露 (其实还未删除) 举例: var person={name:{firstname:'bob'}} var p=person.name delete person.name p.firstname -->'bob' // 依然可以访问p.firstname,存在内存泄露
Oracle将零干预分析加入网络即服务计划
蓝儿唯美
oracle
由Oracle通信技术部门主导的演示项目并没有在本月较早前法国南斯举行的行业集团TM论坛大会中获得嘉奖。但是,Oracle通信官员解雇致力于打造一个支持零干预分配和编制功能的网络即服务(NaaS)平台,帮助企业以更灵活和更适合云的方式实现通信服务提供商(CSP)的连接产品。这个Oracle主导的项目属于TM Forum Live!活动上展示的Catalyst计划的19个项目之一。Catalyst计
spring学习——springmvc(二)
a-john
springMVC
Spring MVC提供了非常方便的文件上传功能。 1,配置Spring支持文件上传: DispatcherServlet本身并不知道如何处理multipart的表单数据,需要一个multipart解析器把POST请求的multipart数据中抽取出来,这样DispatcherServlet就能将其传递给我们的控制器了。为了在Spring中注册multipart解析器,需要声明一个实现了Mul
POJ-2828-Buy Tickets
aijuans
ACM_POJ
POJ-2828-Buy Tickets http://poj.org/problem?id=2828 线段树,逆序插入 #include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>using namespace std;#define N 200010struct
Java Ant build.xml详解
asia007
build.xml
1,什么是antant是构建工具2,什么是构建概念到处可查到,形象来说,你要把代码从某个地方拿来,编译,再拷贝到某个地方去等等操作,当然不仅与此,但是主要用来干这个3,ant的好处跨平台 --因为ant是使用java实现的,所以它跨平台使用简单--与ant的兄弟make比起来语法清晰--同样是和make相比功能强大--ant能做的事情很多,可能你用了很久,你仍然不知道它能有
android按钮监听器的四种技术
百合不是茶
android
xml配置
监听器
实现接口
android开发中经常会用到各种各样的监听器,android监听器的写法与java又有不同的地方; 1,activity中使用内部类实现接口 ,创建内部类实例 使用add方法 与java类似 创建监听器的实例 myLis lis = new myLis(); 使用add方法给按钮添加监听器
软件架构师不等同于资深程序员
bijian1013
程序员
架构师
架构设计
本文的作者Armel Nene是ETAPIX Global公司的首席架构师,他居住在伦敦,他参与过的开源项目包括 Apache Lucene,,Apache Nutch, Liferay 和 Pentaho等。 如今很多的公司
TeamForge Wiki Syntax & CollabNet User Information Center
sunjing
TeamForge
How do
Attachement
Anchor
Wiki Syntax
the CollabNet user information center http://help.collab.net/ How do I create a new Wiki page? A CollabNet TeamForge project can have any number of Wiki pages. All Wiki pages are linked, and
【Redis四】Redis数据类型
bit1129
redis
概述 Redis是一个高性能的数据结构服务器,称之为数据结构服务器的原因是,它提供了丰富的数据类型以满足不同的应用场景,本文对Redis的数据类型以及对这些类型可能的操作进行总结。 Redis常用的数据类型包括string、set、list、hash以及sorted set.Redis本身是K/V系统,这里的数据类型指的是value的类型,而不是key的类型,key的类型只有一种即string
SSH2整合-附源码
白糖_
eclipse
spring
tomcat
Hibernate
Google
今天用eclipse终于整合出了struts2+hibernate+spring框架。 我创建的是tomcat项目,需要有tomcat插件。导入项目以后,鼠标右键选择属性,然后再找到“tomcat”项,勾选一下“Is a tomcat project”即可。具体方法见源码里的jsp图片,sql也在源码里。 补充1:项目中部分jar包不是最新版的,可能导
[转]开源项目代码的学习方法
braveCS
学习方法
转自: http://blog.sina.com.cn/s/blog_693458530100lk5m.html http://www.cnblogs.com/west-link/archive/2011/06/07/2074466.html 1)阅读features。以此来搞清楚该项目有哪些特性2)思考。想想如果自己来做有这些features的项目该如何构架3)下载并安装d
编程之美-子数组的最大和(二维)
bylijinnan
编程之美
package beautyOfCoding; import java.util.Arrays; import java.util.Random; public class MaxSubArraySum2 { /** * 编程之美 子数组之和的最大值(二维) */ private static final int ROW = 5; private stat
读书笔记-3
chengxuyuancsdn
jquery笔记
resultMap配置
ibatis一对多配置
1、resultMap配置 2、ibatis一对多配置 3、jquery笔记 1、resultMap配置 当<select resultMap="topic_data"> <resultMap id="topic_data">必须一一对应。 (1)<resultMap class="tblTopic&q
[物理与天文]物理学新进展
comsci
如果我们必须获得某种地球上没有的矿石,才能够进行某些能量输出装置的设计和建造,而要获得这种矿石,又必须首先进行深空探测,而要进行深空探测,又必须获得这种能量输出装置,这个矛盾的循环,会导致地球联盟在与宇宙文明建立关系的时候,陷入困境 怎么办呢?
Oracle 11g新特性:Automatic Diagnostic Repository
daizj
oracle
ADR
Oracle Database 11g的FDI(Fault Diagnosability Infrastructure)是自动化诊断方面的又一增强。 FDI的一个关键组件是自动诊断库(Automatic Diagnostic Repository-ADR)。 在oracle 11g中,alert文件的信息是以xml的文件格式存在的,另外提供了普通文本格式的alert文件。 这两份log文
简单排序:选择排序
dieslrae
选择排序
public void selectSort(int[] array){ int select; for(int i=0;i<array.length;i++){ select = i; for(int k=i+1;k<array.leng
C语言学习六指针的经典程序,互换两个数字
dcj3sjt126com
c
示例程序,swap_1和swap_2都是错误的,推理从1开始推到2,2没完成,推到3就完成了 # include <stdio.h> void swap_1(int, int); void swap_2(int *, int *); void swap_3(int *, int *); int main(void) { int a = 3; int b =
php 5.4中php-fpm 的重启、终止操作命令
dcj3sjt126com
PHP
php 5.4中php-fpm 的重启、终止操作命令: 查看php运行目录命令:which php/usr/bin/php 查看php-fpm进程数:ps aux | grep -c php-fpm 查看运行内存/usr/bin/php -i|grep mem 重启php-fpm/etc/init.d/php-fpm restart 在phpinfo()输出内容可以看到php
线程同步工具类
shuizhaosi888
同步工具类
同步工具类包括信号量(Semaphore)、栅栏(barrier)、闭锁(CountDownLatch) 闭锁(CountDownLatch) public class RunMain { public long timeTasks(int nThreads, final Runnable task) throws InterruptedException { fin
bleeding edge是什么意思
haojinghua
DI
不止一次,看到很多讲技术的文章里面出现过这个词语。今天终于弄懂了——通过朋友给的浏览软件,上了wiki。 我再一次感到,没有辞典能像WiKi一样,给出这样体贴人心、一清二楚的解释了。为了表达我对WiKi的喜爱,只好在此一一中英对照,给大家上次课。 In computer science, bleeding edge is a term that
c中实现utf8和gbk的互转
jimmee
c
iconv
utf8&gbk编码
#include <iconv.h> #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <string.h> #include <sys/stat.h> int code_c
大型分布式网站架构设计与实践
lilin530
应用服务器
搜索引擎
1.大型网站软件系统的特点? a.高并发,大流量。 b.高可用。 c.海量数据。 d.用户分布广泛,网络情况复杂。 e.安全环境恶劣。 f.需求快速变更,发布频繁。 g.渐进式发展。 2.大型网站架构演化发展历程? a.初始阶段的网站架构。 应用程序,数据库,文件等所有的资源都在一台服务器上。 b.应用服务器和数据服务器分离。 c.使用缓存改善网站性能。 d.使用应用
在代码中获取Android theme中的attr属性值
OliveExcel
android
theme
Android的Theme是由各种attr组合而成, 每个attr对应了这个属性的一个引用, 这个引用又可以是各种东西. 在某些情况下, 我们需要获取非自定义的主题下某个属性的内容 (比如拿到系统默认的配色colorAccent), 操作方式举例一则: int defaultColor = 0xFF000000; int[] attrsArray = { andorid.r.
基于Zookeeper的分布式共享锁
roadrunners
zookeeper
分布式
共享锁
首先,说说我们的场景,订单服务是做成集群的,当两个以上结点同时收到一个相同订单的创建指令,这时并发就产生了,系统就会重复创建订单。等等......场景。这时,分布式共享锁就闪亮登场了。 共享锁在同一个进程中是很容易实现的,但在跨进程或者在不同Server之间就不好实现了。Zookeeper就很容易实现。具体的实现原理官网和其它网站也有翻译,这里就不在赘述了。 官
两个容易被忽略的MySQL知识
tomcat_oracle
mysql
1、varchar(5)可以存储多少个汉字,多少个字母数字? 相信有好多人应该跟我一样,对这个已经很熟悉了,根据经验我们能很快的做出决定,比如说用varchar(200)去存储url等等,但是,即使你用了很多次也很熟悉了,也有可能对上面的问题做出错误的回答。 这个问题我查了好多资料,有的人说是可以存储5个字符,2.5个汉字(每个汉字占用两个字节的话),有的人说这个要区分版本,5.0
zoj 3827 Information Entropy(水题)
阿尔萨斯
format
题目链接:zoj 3827 Information Entropy 题目大意:三种底,计算和。 解题思路:调用库函数就可以直接算了,不过要注意Pi = 0的时候,不过它题目里居然也讲了。。。limp→0+plogb(p)=0,因为p是logp的高阶。 #include <cstdio> #include <cstring> #include <cmath&
按字母分类:
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
其他