自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(34)
  • 收藏
  • 关注

原创 Netty学习 (七、源码剖析Netty启动过程源码)

1、看源码技巧第一次尝试看框架源码,大概就是先写一个demo,然后根据demo 的流程去看核心代码的实习,这个项目就是根据netty包下的echo 样例写的2、源码启动类如下/* * Copyright 2012 The Netty Project * * The Netty Project licenses this file to you under the Apache License, * version 2.0 (the "License"); you may not use thi

2021-05-12 20:21:30 167

原创 腾讯开源框架Tars学习 (2、组件的含义)

1、Tars 框架的定义Tars是【基于名字服务】【使用Tars协议】的高性能【RPC】开发框架,同时配套一体化的【服务治理平台】,帮助个人或者企业快速的以微服务的方式构建自己稳定可靠的分布式应用。Tars也是一个兼顾易用性、高性能、服务治理的框架,目的是让开发更简单,聚焦业务逻辑,让运营更高效,一切尽在掌握。解决了如上图的问题,框架整体思维 就是把开发 运营,测试 整合到一起,简单易用2、设计思路Tars的设计思路是采用微服务的思想对服务进行治理,同时对整个系统的各个模块进行抽象分层,将各个层

2021-05-06 22:06:27 330

原创 Netty学习(六、Channel与Pipeline组件源码分析)

11

2021-05-05 21:33:58 201 2

原创 腾讯开源框架Tars学习 (1、搭建平台,输出hello world)

1、使用docker 搭建平台环境##拉取最新的镜像docker pull tarscloud/framework:latest#拉取节点镜像docker pull tarscloud/tars-node:latest#拉取数据库镜像docker pull mysql:5.6##创建虚拟网络docker network create -d bridge --subnet=172.25.0.0/16 --gateway=172.25.0.1 tars## 数据库docker run -

2021-05-05 21:03:18 629 2

原创 Netty学习(五、Netty解决粘包拆包)

1.什么是TCP粘包与拆包首先TCP是一个"流"协议,犹如河中水一样连成一片,没有严格的分界线。当我们在发送数据的时候就会出现多发送与少发送问题,也就是TCP粘包与拆包。得不到我们想要的效果。所谓粘包:当你把A,B两个数据从甲发送到乙,本想A与B单独发送,但是你却把AB一起发送了,此时AB粘在一起,就是粘包了所谓拆包: 如果发送数据的时候,你把A、B拆成了几份发,就是拆包了。当然数据不是你主动拆的,是TCP流自动拆的2.TCP粘包与拆包产生原因1.进行了MSS大小的TCP分段2.以太网帧的ply

2021-05-04 22:03:50 281

原创 Netty学习(四、Netty的核心模块核心组件)

1、Channel接口基础的IO操作,如绑定、连接、读写等都依赖于底层网络传输所提供的原语,在Java的网络编程中,基础核心类是Socket,而Netty的Channel提供了一组API,极大地简化了直接与Socket进行操作的复杂性,并且Channel是很多类的父类,如EmbeddedChannel、LocalServerChannel、NioDatagramChannel、NioSctpChannel、NioSocketChannel等。2、EventLoop接口EventLoop定义了处理在连接

2021-05-04 21:54:06 202 1

原创 Netty学习(三、Netty线程图与流程)

线程图如下Netty抽象出两组线程池BossGroup专门负责接收客户端的连接,WorkerGroup专门负责网络的读写BossGroup和 WorkerGroup类型都是NioEventLoopGroupNioEventLoopGroup相当于一个事件循环组,这个组中含有多个事件循环,每一个事件循环是NioEventLoopNioEventLoop表示一个不断循环的执行处理任务的线程,每个NioEventLoop都有一个selector ,用于监听绑定在其上的socket的网络通

2021-05-04 21:42:34 170 1

原创 Netty 学习 (二、服务器与客户端的通信)

1.首先创建NettyServer的主类创建一个EventLoopGroup BossGroup用于处理连接,一个工作组 管理任务package com.ccw.qhj.netty;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.*;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel.socket.SocketChannel

2021-05-04 21:08:31 131

原创 Netty学习(一 、Netty基本概念)

1.Netty简介Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架。Netty 是一个广泛使用的 Java 网络编程框架(Netty 在 2011 年获得了Duke’s Choice Award,见https://www.java.net/dukeschoice/2011)2.为什么Netty受欢迎1.并发高Netty 使用的是主从reactor线程模型,主从reactor模型有一个处理连接的主线程,然后有一个分发任务的子线程,

2021-05-04 20:59:56 179

原创 网络编程 Unix五种 IO模型

1. 服务端怎么处理一条请求?图解如下:步骤如下:获取请求数据,客户端与服务器建立连接发出请求,服务器接受请求(1-3);构建响应,当服务器接收完请求,并在用户空间处理客户端的请求,直到构建响应完成(4);返回数据,服务器将已构建好的响应再通过内核空间的网络 I/O 发还给客户端(5-7)。设置高性能 高并发服务端 大概就以下俩点吧:服务器如何管理连接,获取输入数据;服务器如何处理请求。“I/O 模型”的基本概念阻塞调用与非阻塞调用阻塞调用是指调用结果返回之前,当前线程会被

2021-04-17 19:48:39 101

原创 NIO三大核心组件

三大组件的介绍1、Buffer(缓冲区)用于存储数据,底层是一个数组拥有三个核心属性:capacity、limit、positioncapacity:数组的长度,意为缓冲区的总大小limit:可读/可写的的长度position:即将写入或者写出的下一个数据的位置之间的大小关系为 position <= limit <= capacity2、Channel(通道)一个io操作的通信桥梁,起到连接作用,io操作并不直接对buffer进行数据的交换,必须通过Channel进行读/写

2021-04-17 19:37:03 594

原创 Reactor线程模型

Reactor 模式针对传统阻塞 I/O 服务模型的 2 个缺点,比较常见的有如下解决方案:基于 I/O 复用模型:多个连接共用一个阻塞对象,应用程序只需要在一个阻塞对象上等待,无需阻塞等待所有连接。当某条连接有新的数据可以处理时,操作系统通知应用程序,线程从阻塞状态返回,开始进行业务处理;基于线程池复用线程资源:不必再为每个连接创建线程,将连接完成后的业务处理任务分配给线程进行处理,一个线程可以处理多个连接的业务。I/O 复用结合线程池,这就是 Reactor 模式基本设计思想,如下图:R

2021-04-17 19:16:16 804 1

原创 网络编程中的I/O复用模型

1. 服务端怎么处理一条请求?图解如下:步骤如下:获取请求数据,客户端与服务器建立连接发出请求,服务器接受请求(1-3);构建响应,当服务器接收完请求,并在用户空间处理客户端的请求,直到构建响应完成(4);返回数据,服务器将已构建好的响应再通过内核空间的网络 I/O 发还给客户端(5-7)。设置高性能 高并发服务端 大概就以下俩点吧:服务器如何管理连接,获取输入数据;服务器如何处理请求。“I/O 模型”的基本概念阻塞调用与非阻塞调用阻塞调用是指调用结果返回之前,当前线程会被

2021-04-17 17:33:33 553

原创 NIO实现客户端与服务器通讯

一、NIO是什么?NIO(JDK1.4):是一种同步非阻塞IO,主要有三大核心部分:Channel(通道),Buffer(缓冲区), Selector(多路复用器)。传统IO基于字节流和字符流进行操作,而NIO基于Channel和Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector(多路复用器)用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个线程可以监听多个数据通道二、服务器客户端通信实现1.服务方代码如下(示例):package

2021-04-11 21:22:18 247

原创 Bio实现客户端通信

一、BIO是什么?BIO:Blocking I/O,同步阻塞I/O模式,数据的读取和写入必须阻塞在一个线程内等待其完成。 模式简单,使用方便。但并发处理能力低,通信耗时,依赖网速。二、服务器客户端通信实现1.服务方代码如下(示例):package com.ccw.api;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.ServerSocket

2021-04-10 19:22:27 238

原创 leetcode每日一题---1115.交替打印FooBar

题目链接:https://leetcode-cn.com/problems/print-foobar-alternately/就是一个简单的生产者 消费者模式:AC代码:class FooBar { private int n; private ReentrantLock lock = new ReentrantLock(); private Condition condition = lock.newCondition(); private volatile in

2020-11-11 20:14:02 150 1

原创 letcode-每日一题 1114. 按序打印

我们提供了一个类:public class Foo { public void first() { print("first"); } public void second() { print("second"); } public void third() { print("third"); }}三个不同的线程将会共用一个 Foo 实例。线程 A 将会调用 first() 方法线程 B 将会调用 second() 方法线程 C 将会调用 third() 方法请设计修改程序,以

2020-11-11 19:52:58 329

原创 多线程状态改变图解

下面这是一张线程状态切换示意图1)新创建一个新的线程对象后,再调用它的start()方法,系统会为此线程分配CPU资源,使其处于Runnable(可运行)状态,这是一个准备运行的阶段。如果线程抢占到CPU资源,此线程就处于Running(运行)状态。2) Runnable状态和Running 状态可相互切换,因为有可能线程运行一段时间后,有其他高优先级的线程抢占了CPU资源,这时此线程就从Running状态变成Runnable状态。线程进人Runnable状态大体分为如下5种情况:List

2020-10-08 21:19:57 147

转载 Linux命令学习

文件和目录cd /home 进入 ‘/ home’ 目录’cd … 返回上一级目录cd …/… 返回上两级目录cd 进入个人的主目录cd ~user1 进入个人的主目录cd - 返回上次所在的目录pwd 显示工作路径ls 查看目录中的文件ls -F 查看目录中的文件ls -l 显示文件和目录的详细资料ls -a 显示隐藏文件ls [0-9] 显示包含数字的文件名和目录名tree 显示文件和目录由根目录开始的树形结构lstree 显示文件和目录由根目录开始的树形结构mkdir d

2020-10-08 21:06:02 93

原创 多线程核心技术(三)--线程间通信

等待/通知机制的实现wait方法方法wait的作用是使当前执行代码的线程进行等待,wait方法是Object类的方法。该方法用来将当前线程置入“预执行队列”中,并且在wait所在的代码处停止执行,直到接到通知或被中断为止。在调用wait方法之前,线程必须获得该对象的对象级别锁。即只能在同步方法或同步代码块中调用wait方法。在执行wait方法后,当前线程释放锁。在从wait返回前,线程与其他线程竞争重新获得锁。如果调用wait时没有持有适当的锁,则抛出IllegalMonitorStateExcepti

2020-09-27 21:36:25 87

原创 java多线程核心技术(二)对象及变量的并发访问

线程安全与非线程安全非线程安全会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的后果就是脏读,也就是取到的数据其实是被更改过的。而“线程安全”就是以获得的实例变量的值是经过同步处理,不会出现脏读的现象。线程安全问题产生的原因:1.多个线程在操作共享的数据。2.操作共享数据的线程代码有多条。当一个线程在执行操作共享数据的多条代码过程中,其他线程参与了运算。就会导致线程安全问题的产生。解决思路就是将多条操作共享数据的线程代码封装起来,当有线程在执行这些代码的时候,其他线程不可以参与运算。必须要

2020-09-24 20:06:50 84

原创 java多线程核心技术(一) 多线程技能

第一章 java多线程技能1.1进程和多线程的概念进程是操作系统的基础,当一个程序载数据集合运行时的集合,线程则是进程中独立运行的子任务。比如QQ.exe运行的时候 你可以同时聊天 还有视频。1.1.1使用多线程的好处同样的俩个任务,任务1和任务2如果在单任务的环境中,需要一个任务任务的去执行,而在多任务的情况中 我可以俩个任务同时执行,而且可以在俩个任务中进行随意切换。这样使用多线程的好处显而易见,使CPU的利用率大大的得到提升。1.2 多线程的使用1.2.1实现多线程在java的jdk

2020-09-20 19:47:34 296

原创 数据库系统概述 -----第一章总结

1.1数据库系统概述1.数据库的四个基本概念:数据(Data),数据库(DB),数据库管理系统(DBMS),数据库系统(DBS)数据(data):是数据库中存储的基本对象数据库(DB):是长期储存在计算机内,有组织的,可共享的大量数据的集合数据库管理系统(DBMS):位于用户应用与操作系统之间的一层数据管理软件,可以科学地组织和存储数据,高效地获取和维护数据数据库系统(DBS):是指...

2020-04-28 21:52:30 589 1

原创 数据库简单sql语句

创建数据库: creat database (数据库名)查看所有数据库: show database使用某一数据库: use (数据库名)查看表结构:describe (表名)向表中插入数据:insert into 表名 VALUES();查找表中数据:select (字段名) from 表名删除表中数据: delete from 表名更新表中数据:update set (字段名)=...

2020-04-21 16:36:26 135

原创 《JAVA核心卷二》------Java中IO流类

Java中流的概念细分按流的方向分类: 1. 输入流:数据流向是数据源到程序(以InputStream、Reader结尾的流)。 2. 输出流:数据流向是程序到目的地(以OutPutStream、Writer结尾的流)。按处理的数据单元分类: 1. 字节流:以字节为单位获取数据,命名上以Stream结尾的流一般是字节流,如FileInputStream、FileOutputStr...

2020-02-17 22:39:22 134

原创 面试复盘

1angularjs1使用了mvc进行web开发,其中控制层一般用什么语言来定义 正确答案 AA javascriptB htmlC cssD jquery2AngularJS1中指定控制器的是哪个指令? 正确答案 DA ng-routeB ng-templateC ng-modelD ng-controller...

2019-11-10 09:46:02 276

原创 html

html 不是一门编译语言 而是超文本标记语言html是一个纯本文文件(就是用txt文件改名而成),用一些标签来描述文字的语义,这些标签在浏览器里面是看不到的,所以称为“超文本”,所以就是“超文本标记语言”了。一 html 以html 开头 html 结尾 ,标签除了几个特殊的标签以外 必须成对出现 有头就要有尾标签 可以嵌套使用二 html 中的样式 有内部直接定义 资源引用样式标签...

2019-10-12 20:25:42 83

原创 9,19面试题复盘

(1)关于依赖注入,下列选项中说法错误的是()//正确答案是 BA. 依赖注入能够独立开发各组件,然后根据组件间关系进行组装B. 依赖注入使组件之间相互依赖,相互制约C. 依赖注入提供使用接口编程D. 依赖注入指对象在使用时动态注入解析:依赖注入目的是减少组件之间的耦合度,使开发变得简单。(2)下面哪个选项正确创建socket连接? //正确答案 BA. Socket s = n...

2019-09-25 21:37:13 231

原创 9-17 复盘

(1)、 对以下 HTTP 状态码描述,不正确的是? BA. 301 和 302 状态码都表示请求的资源被转移到新地址B. 服务器返回 304 时,需要同时返回请求的资源内容。C. 2xx 的状态码表示请求成功D. 如果服务器请求第三方 API 超时,应该返回 504解析:100 - 继续。 101 - 切换协议。 110 重新启动标记答复。 120 服务已就绪,在 nnn 分钟后开始...

2019-09-15 20:18:08 252

原创 9-8面试题复盘

关于抽象类的叙述正确的是?( B) //正确答案 AA.抽象类不可以实例化B.抽象类就是一种特殊的接口C.抽象类的方法都是抽象方法D.抽象类的导出类一定不是抽象类链接:https://www.nowcoder.com/questionTerminal/97da94abbcab49e7b2d3f215f59f34bf来源:牛客网A选项中,抽象类不能实例化,这句是正确的。后面,抽象类不...

2019-09-08 15:31:29 331

原创 数据结构第七章(图---总结一)

首先看的是图的各种定义 一大堆 没仔细记 就看了没多久 因为性质太多了会了(1)图的创建保存方式一 邻接矩阵法用二维数组进行保存即可二 邻接表用了很多结构体数组保存点 然后在结构体中会有个首指针 这个指针专门用来保存 与该节点所连接的点 的各种信息学会了邻接表的创建 虽然太多代码。。但是还是自己能敲出来(2)图的遍历方式一 深度优先搜索(dfs)函数递归调用 由一个节点...

2019-08-12 20:36:33 301

原创 数据结构第六章第(树--总结)

第六章–树这章基础知识稍微看了下 二叉树的基本性质记了一点点 重点看了二叉树的创建 二叉树的遍历(1)二叉树遍历分为四种:1 前序遍历 --原理 先根节点再左儿子 再又儿子2 中序遍历 --原理 先左儿子 再根节点 再右儿子3 后序遍历 --原理 先左右儿子 再根节点4 层次遍历 – 和bfs很像 一层一层下去 用队列实现总结 前三种遍历 记住输出位置是在递归的哪个位置...

2019-08-12 19:46:40 159

原创 最短路径(迪杰斯特拉求法)

具体思路 就是根据 与点相连接的 最短的边来产生路径;既 开始从某个特定的顶点出发具体步骤:1 首先 生成俩个 数组 ,一个用来存放这个邻接矩阵的权值 一个用来生成 这个点与所有点的需要费用,然后 给 保存这个权值的数组 赋值最开始 的与这个点连接的 邻接 表的 值,然后用循环遍历 这些点中的最小的权值既点的坐标 ,然后以这个坐标为单位继续找出与这个 与这个坐标相连接的 点的最小值,一直找...

2019-08-11 21:35:25 219

原创 并查集(初学)

int unionsearch(int root) //查找根结点{ int son, tmp; son = root; while(root != pre[root]) //我的上级不是掌门 root = pre[root]; while(son != root) //我就找他的上级,直到掌门出现 { tmp = pre[son]; pre[son] = root; son = tmp; } retur

2019-08-10 09:15:34 104

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除