- 博客(72)
- 资源 (1)
- 收藏
- 关注
原创 【数据结构和算法一】常用排序算法
目录介绍冒泡排序代码优化插入排序代码如下所示选择排序代码希尔排序代码快速排序归并排序代码如下所示基数排序(桶排序)代码注意介绍如下的,代码都是基于从小到大排序的思路进行分析的。从大到小的话思想是一致的,只有某一小部分的代码改下即可。冒泡排序基本思想是:通过比较相邻元素的顺序进行交换。如果从小到大排序,就把大的一次向后移动,当循环一次时,最大的就到最后了。如下所示:第一轮循环介绍如下,两个指针,一个指向当前,一个指向后一个,判断当前的数是不是比后面下,小的话就交换,不小就后移一位继续比较。
2020-11-20 15:44:16
214
原创 【网络编程】学习系列(三)ServerSocket类的使用
目录ServerSocket类的使用1.1 aacept与超时Timeout1.2 构造方法backlog的含义1.3 构造方法的InetAddress1.4 绑定到指定的Socket地址1.5 绑定到指定的socket地址并设置backlog数量1.6 获取本地的SocketAddress对象以及本地端口1.7 InetSocketAddress类的使用1.8 关闭与关闭状态获取1.9 判断Socket的绑定状态1.10 获取IP地址1.11 Socket选项ReuseAddress1.12 Socket
2020-10-29 17:03:11
1653
原创 【网络编程】学习系列(二)基于TCP的Socket通信
目录基于TCP的Socket通信1.1 ServerSocket类的accept()方法1.2 Socket中的InputStream的read()方法1.3 客户端向服务端传递字符串1.4 服务端向客户端传递数据1.5 实现服务端与客户端多次的往来通信1.6 Stream的close()方法造成Socket关闭1.7 客户端传输图片到服务器1.8 TCP三次握手连接过程1.9 服务端与客户端互传对象以及I/O流顺序问题基于TCP的Socket通信Tcp提供了基于流的长连接的数据传递,发送的数据带有顺序
2020-10-29 16:57:00
691
原创 使用UDP实现广播发送
目录需求描述:参考代码代码描述ClientA代码描述:ClientB代码描述运行结果需求描述:第一步:现在有ClientA向网络中的所有设备的8888端口发送广播,ClientB需要监听8888端口来收到广播信息第二步:ClientB在收到广播信息后需要给予回执。需要将消息回复过去参考代码/** * 广播出去,并接受收到信息的回执 */public class ClientA { private static final Integer BroadCast_Port = 8888;/
2020-10-29 15:40:16
3137
1
原创 【网络编程】学习系列(一)NetWrokInterface介绍
文章目录介绍1.NetWrokInterface类1.1 方法的介绍1.1.1 获取网络接口的基本信息1.1.2获取MTU大小1.1.3 子接口处理1.1.4 获取硬件地址1.1.5获取IP地址1.1.6 InterfaceAddress类的使用1.1.7 判断是否为点对点设配1.1.8 是否支持多播1.2 NetworkInterface类的静态方法1.2.1 根据索引获得NetworkInterface对象1.2.2 根据网络接口名称获得NetworkInterface对象1.2.3 根据InetAdd
2020-10-15 14:51:47
932
原创 【NIO】学习系列(三)Channel
文章目录1.Channel介绍2.通道的接口层次类型3.通道的特性3.1AsyncharonousChannel接口介绍3.2 AsynchronousByteChannel接口介绍3.3 ReadableByteChannel接口介绍3.4 ScatteringByteChannel接口的介绍3.5 WriteableByteChannel接口的介绍3.6 GatheringByteChannel接口介绍3.7 Bytechannel接口介绍3.8 SeekableByteChannel接口的介绍3.9
2020-10-14 19:19:40
8346
原创 【多线程】Semphore工具
文章目录1.构造方法2.核心方法3.代码测试4.使用Semaphore实现简单的锁5.使用场景6.注意事项1.构造方法//创建一个 Semaphore与给定数量的许可证和nonfair公平设置。Semaphore(int permits)//创建一个允许给定数量 Semaphore和给定的公平环境。Semaphore(int permits, boolean fair) 参数介绍:permits:表示当前的凭证数量fair:表示当前是不是平等的(FIFO)先进先出,设置为false是表示
2020-10-14 15:23:54
122
原创 【多线程】Exchanger工具
目录构造方法核心方法测试代码注意点Exchanger主要用于成对线程交换数据,不成对的话当前线程就会阻塞。1.构造方法public Exchanger();2.核心方法public V exchange(V x);public V exchange(V x, long timeout, TimeUnit unit);3.测试代码public V exchange(V x)方法测试定义了两个线程,线程a和线程b,线程a发送数据 data - a,线程b发送数据 data
2020-10-14 14:34:35
184
原创 【多线程】CyclicBarrier工具
CyclicBarrierCyclickBarrier:循环篱笆。可以给离散的任务添加逻辑层次。例如:在跑步比赛中,需要所有运动员都到场了。裁判才能进行吹哨比赛。构造犯法如下所示//创建一个CyclicBarrier对象,并指定其parties CyclicBarrier(int parties) //指定parties,并且执行其callBack(在所有线程都到达时执行此barrierAction) CyclicBarrier(int parties, Runnable barrie
2020-10-14 11:55:25
220
原创 【NIO】学习系列(二)ByteBuffer类
ByteBuffer类byteBuffer是Buffer类的子类,可以在缓冲区中以字节为单进行数据存取。在nio中会经常使用byteBufferByteBuffer主要提供了六类操作以绝对位置和相对位置读写单个字节的get()和put()方法使用相对批量get(byte[] dst)方法可以将缓冲区中连续的字节输出到byte[] dst目标数组中。使用相对批量put(byte []src)方法可以将byte[] 数组或其他字节缓冲区中的连续字节存储到此缓冲区中。使用绝对和相对getType
2020-10-13 15:57:18
1255
2
原创 【NIO】学习系列(一)Buffer
NIO概念我们知道常见的IO是阻塞的且效率低下的,为了解决这个问题引入了NIO,NIO在IO的基础上使用了cha[] 、byte[]进行了封装,采用ByteBuffer类来操作数据,而且针对File和Socket的channel,使用同步非阻塞实现高性能处理。网上一大堆,这里不做过多阐述Buffer类buffer类是一个抽象类已知子类(除了boolean类型,其他基本类型都有对应的buffer)StringBuffer在NIO没有涉及,字符缓冲可用CharBuffer来做。ByteBuffer
2020-10-13 15:31:45
329
原创 Count down设计模式
Count down设计模式介绍在多线程执行时,如何保证在所有线程都执行完成才统一退出?原始的使用方式是使用join,对每个线程都join。在java并发包中有CountDownLatch可以帮助我们解决,只需要new 一个CountDownLatch填入等待执行完成线程的数量即可,在每个线程结束时进行countDown(),并且在主方法设置屏障,只有前面的线程执行完屏障后面的任务才会继续执行public class Application { public static void main
2020-08-22 15:34:03
226
原创 上下文设计模式
上下文模式概述:在方法的调用链需要一个上下文来贯穿整个调用链,主要通过它来存储数据和传递数据。通常的上下文模式如下所示(下面也给出了ThreadLocal进行上下文的改造):1.创建ExcutionTask主要用来执行任务public class ExcutionTask implements Runnable { private final QueryForDBAction queryForDBAction = new QueryForDBAction(); private fi
2020-08-21 22:24:08
750
原创 生产者消费者设计模式
生产者消费者设计模式概述有两个线程生产者和消费者,有一个任务队列(有大小限制,太大了阻塞当前的生产者,不让其生产)。队列中有put和take方法。put方法时将消息(Message)放入队列中,唤醒消费者进行消费take拿出一个消息进行消费。唤醒生产者可以生产。代码实现如下1.编写Message消息类public class Message { private String data; public Message(String data) { this.
2020-08-21 22:18:14
396
原创 Future设计模式
Future设计模式当执行一个操作时,需要执行很长时间的阻塞。而future设计模式可以使并不阻塞当前的执行,让本线程可以继续向下执行。当需要结果的时候我去拿就好了。创建Future接口这是一个一个未来接口,当方法调用时立即返回一个Future,根据future的get方法可以拿到返回的值。public interface Future<T> { T get() throws InterruptedException;}创建FutureTask接口这是一个任务
2020-08-21 10:13:08
244
原创 volatile关键字简单总结
什么是缓存一致性说到volatile必须了解的是缓存之间的一致性,假设有双核cpu。在CPU1运行线程1,在CPU运行线程2,两个线程共享1个变量为TEMP。TEMP并未被volatile修饰,此时线程1对TEMP进行写操作,线程2对TEMP只有读取操作。无论线程1如何修改TEMP线程2都不会感知到。原因:线程1和线程2维护各自的cache而cache中维护各自的TEMP。线程1有写操作,在写入成功会把TEMP从cache刷新到主存中。而线程2不会从主从中拿数据,只会永远从cache里面拿数据,因为线
2020-08-18 23:27:24
173
原创 实现简易的线程池
目标实现一个线程池,在初始化的时候就会创建固定大小的线程,当满足不了需求就会将线程数增加到active,当active满足不了就会增加到max线程池支持提交任务,但是任务队列有数量限制,当达到某一个值就会,下面进来的任务就会执行拒绝策略。用户可以自定义拒绝策略来保证当前任务队列过多时如何拒绝(抛出异常?忽略?进入临时队列?)分为三次设计,由浅入深步骤1:实现初始化就创建线程池步骤2:加入min active max 线程池大小的切换。步骤3:加入拒绝策略...
2020-08-18 23:14:29
152
原创 模拟多个线程执行任务,限制只能开启固定大小的线程
实现目标实现现有20个线程去执行各自的任务,但是同一时刻只能开启5个线程去执行任务,只有某一个执行完了才能继续开启下面的线程,相关代码如下所示。实现思路:使用中间变量CONTROLLER来控制当前线程的大小。如果创建线程那就向队列加一个值,如果执行完了就拿出来一个值,并唤醒其他线程,这时其他线程发现有一个走了就会争抢新出的这个名额,当一个线程抢到了,其他就会阻塞掉。public class CaptureService { private static final List<Thr
2020-08-18 23:06:16
297
原创 简单实现自己的显示锁
实现的目标实现自己的锁,使线程同步。提供了两个lock方法一个带有参数(timeout)当固定时间内没有执行的线程就不让他去执行了。1.创建接口 Lock定义了超时异常,当等待强锁的时间超过timeout让他超时异常public interface Lock { class TimeoutException extends Exception{ TimeoutException(String message){ super(message);
2020-08-18 22:39:35
142
原创 设计模式-六种设计原则
设计原则1.单一职责原则降低类的复杂度,一个类只负责一个职责。提高代码的可读性、可维护性。降低代码变更引起的风险。通常情况下:应该遵守单一职责原则,只有在逻辑足够简单可以违反单一职责原则,可以在方法级别保持单一职责。2.接口隔离原则客户端不应该依赖他不需要的忌口,即一个类对另一个类的依赖应该建立在最小接口上。例如有接口1,此时在接口1中有方法1、方法2、方法3、方法4、方法5。有类A、B实现了接口1,但是A只会用到方法1、2、3,方法B只会用到方法1、4、5。接口隔离原则改进:
2020-08-03 23:01:42
186
原创 读写锁分离设计模式
读写锁分离设计为什么需要分离?在多线程下读取数据不能串行化,否则会导致效率下降。这里必须使用读写锁分离如下表所示在读的情况时另外线程读操作,不需要同步在读的情况,另外线程在写操作,必须同步加锁一个线程在写入,另一个线程在读取需要同步加锁一个线程在写入,另个线程在写需要同步加锁public class ReadWriteDemo { private int readingReader = 0; private int waitingReader = 0; p
2020-07-13 16:06:58
234
原创 Springcloud-Bus消息总线
官网Bus消息总线概述Spring Cloud Bus配合Spring Cloud Config使用可以实现配置的动态刷新什么是总线在分布式系统中通常使用消息代理来实现共用的消息主题,并让所有的微服务都连接上,所产生的的消息会被所有的消费者消费,所以叫消息总线。基本原理ConfigClient实例都会监听MQ中同一个topic(默认是springcloudbus)。当一个服务刷新数据时会把这个信息放入topic中,这样监听他的服务就会得到通知,然后更新配置。bus的两种代理模式
2020-07-12 17:46:23
162
原创 Springcloud-Config配置中心
Config配置中心介绍官网通过全局的配置中心,来统一管理零散的微服务,使配置一处修改处处生效配置中心分为:服务端和客户端架构如下。系统级配置和用户级配置创建bootstrap.yml为系统级配置创建application.yml为用户级别配置系统级别的配置优先级更高配置流程1.在github上创建仓库–例如springcloud-config2.在仓库添加yml文件,例如config-dev.yml这里的命名规范必须加-号3.创建服务端配置4.在客户端配置服务器端配置
2020-07-09 17:57:02
170
原创 java对象的创建流程及对象的访问方式
java的对象创建流程1.虚拟机遇到new关键字,查看能否在常量池中定位到符号的引用2.判断类是否被加载、解析和初始化3.为这个对象分配内存,其中java堆内存的分配方式有两种(1)指针碰撞的方式如下如所示,将内存当做成规整的形状当创建新的对象时指针左移,增大使用的空间,左移的空间就是新对象分配的空间。具体步骤:开辟空间、移动指针(2)空闲列表方式,java内存基本都是不规整的片段,...
2020-04-03 23:28:52
348
1
原创 JVM运行时数据区内存分布
java运行时的数据区,主要包括五部分1.方法区2.java虚拟机栈3.本地方法栈4.堆5.程序计数器具体分布如下图所示各内存介绍如下程序计数器在java中有多线程概念,当a线程抢占到cpu时,此时正常执行且时间片到,此时b线程抢占到cpu,如此反复当下次a线程抢占到cpu时需要知道上次执行到哪了,这时程序计数器的作用就凸显出来:记录当前代码执行的行数。程序计数器是内存中唯一一...
2020-04-03 22:47:59
185
原创 java接入阿里云短信注册
1.工程目录如下2.接入消息中间件activeMQ加入依赖<dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms</artifactId> <version>5.0.8.RELEASE<...
2020-03-25 21:54:42
365
原创 springBoot配置拦截器
1.编写配置类贴上@Configuration注解,覆盖addInterceptors方法@Configurationpublic class MyInterceptorConfigure implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registr...
2019-12-24 20:39:26
182
原创 spring boot使用flyway
spring boot集成flyway1.添加pom依赖 <plugin> <groupId>org.flywaydb</groupId> <artifactId>flyway-maven-plugin</artifactId> <executions> ...
2019-12-21 19:06:45
115
原创 Freemaker入门程序
1.创建普通的工程即可2.添加依赖<dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.23</version></dependency>...
2019-12-05 09:02:20
185
原创 Linux下安装solr
获取安装包链接:https://pan.baidu.com/s/1yA2jtZumDuajGdFPcXiIew提取码:ajdw在linux的usr/local下创建目录solr,将这几个文件放进solr文件夹下1.安装tomcat解压tomcat进入solr文件夹,解压tocat,并改名为tomcatcd /usr/local/solrtar -zxvf apache-tomca...
2019-11-29 15:07:46
243
原创 Linux和Window下安装redis
redis文件地址https://pan.baidu.com/s/1hfGpvoikJgKBSREH4eQtTQ提取码:dg8e两个文件.tar.gz的是linux环境的安装包安装window下的redis解压缩标注的压缩包,运行redis-servicer.exe安装成功!安装linux下的redis进入linux的usr下的local放入安装包查看结果解压re...
2019-11-28 12:13:13
190
原创 管道流实现线程间的通信
管道流(PipedInputStream、PipedOutputStream)继承自inputStream,一般用户线程间通信,不过一般不用它。。。。测试案例发送方线程创建class SendThread implements Runnable{ private PipedOutputStream outputStream = new PipedOutputStream(); ...
2019-11-15 20:34:44
190
原创 Spring配置单例,原型,和初始化方法和销毁方法
1.在xml文件中引入对应的包扫描<context:component-scan base-package="XXX.XXX"/>将类交给spring管理,可以使用以下注解(1)@Component(2) @Sservice(3) @Controller(4) @Repository用法都是将类交给spring管理只是语意不同2.初始化调用的方法@PostCo...
2019-11-15 20:26:09
318
1
原创 Spring属性注入的几种方式
1.方式一:通过set方法注入 <bean id="user" class="com.fuke.domain.User"> <property name="username" value="张三"/> <property name="password" value="1234"/> </bean>@...
2019-11-03 11:50:24
795
原创 单例设计模式实现的几种方式
1.饿汉模式,静态常量方式饿汉模式避免了线程同步的问题,因为它是在类加载的时候就进行了对象的创建缺点:容易造成资源浪费public class Single{ private static final Single instance = new Single(); private Single(){ } public static Single getInst...
2019-10-27 15:07:51
146
原创 SpringMVC自定义类型转换器
在springmvc中内部自带了类型转换器,比如前台传入age,用String或者Integer来接收都可以,但是在date类型接收时,必须用2018/11-12这样的形式若用-隔开会报错,解决办法:自定义类型转换器1.编写转换器类并实现Converter接口public class ConvertTest implements Converter<String, Date> {...
2019-10-25 20:27:53
151
原创 SpringMVC中modelAttribute注解
1.注解修饰参数,注意点,虽然并未在这里将user对象添加到model中,但springmvc会自动添加进去,key为类名小写,value为当前对象@RequestMapping("/testModelAttr") public String testModelAttr(User user,Model model){ System.out.println(model);...
2019-10-24 22:34:07
188
原创 SpringMVC接受json参数和jquery表单序列化
html代码<form id="myform"> user:<input type="text" name="username"><br> age:<input type="text" name="age" ><br> 爱好:<input type="checkbox" name="hobby" value...
2019-10-24 21:26:26
397
原创 SpringMVC文件下载
1.前台请求<a href="/download/druid配置参数.png">下载druid配置</a>2.后台rest风格的下载方式,这里再requestMapping必须加上filename:.+主要解决文件名不全的问题@RequestMapping("/download/{filename:.+}") public ResponseEntity d...
2019-10-23 20:03:15
114
原创 RequestHeader和CookieValue注解
1.RequestHeader用来获取指定的请求头这里给一个key就可以获取指定的请求头信息@RequestMapping("/headerTest") public String result(@RequestHeader("Referer") String referer, @RequestHeader("Host") String host){ ...
2019-10-23 19:27:37
600
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人