java
文章平均质量分 89
Java相关
geminigoth
大龄程序员,带着14位小朋友做牛马
展开
-
Java-正则表达式 备份
1.".":匹配任何字符2."\d":匹配数字[0-9]的简写3 "\D":匹配非数字[^0-9]的简写4 "\s":空白字符:空格、制表符等5."\S":非空白字符6."\w":单词字符:[a-zA-Z_0-9]的简写,包括下划线7."\W":非单词字符示例代码// 1.".":匹配任何字符System.out.println("你".matches("."));//trueSystem.out.println("你".matches(".."));原创 2024-09-02 14:30:00 · 343 阅读 · 0 评论 -
Java-正则表达式
1.".":匹配任何字符2."\d":匹配数字[0-9]的简写3 "\D":匹配非数字[^0-9]的简写4 "\s":空白字符:空格、制表符等5."\S":非空白字符6."\w":单词字符:[a-zA-Z_0-9]的简写,包括下划线7."\W":非单词字符示例代码// 1.".":匹配任何字符System.out.println("你".matches("."));//trueSystem.out.println("你".matches(".."));原创 2024-09-02 10:30:00 · 664 阅读 · 0 评论 -
java-面向对象综合练习 备份
需求:格斗游戏,每个游戏角色的姓名,血量,都不相同,在选定人物的时候(new对象的时候),这些信息就应该被确定下来。举例:程序运行之后结果为:姓名为:乔峰 血量为:100姓名为:鸠摩智 血量为:100乔峰举起拳头打了鸠摩智一下,造成了XX点伤害,鸠摩智还剩下XXX点血。鸠摩智举起拳头打了鸠摩智一下,造成了XX点伤害,乔峰还剩下XXX点血。乔峰举起拳头打了鸠摩智一下,造成了XX点伤害,鸠摩智还剩下XXX点血。鸠摩智举起拳头打了鸠摩智一下,造成了XX点伤害,乔峰还剩下XXX点血。原创 2024-08-05 21:37:27 · 253 阅读 · 0 评论 -
java-面向对象综合练习
需求:格斗游戏,每个游戏角色的姓名,血量,都不相同,在选定人物的时候(new对象的时候),这些信息就应该被确定下来。举例:程序运行之后结果为:姓名为:乔峰 血量为:100姓名为:鸠摩智 血量为:100乔峰举起拳头打了鸠摩智一下,造成了XX点伤害,鸠摩智还剩下XXX点血。鸠摩智举起拳头打了鸠摩智一下,造成了XX点伤害,乔峰还剩下XXX点血。乔峰举起拳头打了鸠摩智一下,造成了XX点伤害,鸠摩智还剩下XXX点血。鸠摩智举起拳头打了鸠摩智一下,造成了XX点伤害,乔峰还剩下XXX点血。原创 2024-08-05 16:17:34 · 561 阅读 · 0 评论 -
Java——查漏补缺(1) 备份
在打印的时候,把前面字符串的长度补齐到0,或者8的整数倍。最少补1个空格,最多不8个空格。原创 2024-08-01 15:00:00 · 462 阅读 · 0 评论 -
Java——查漏补缺(1)
在打印的时候,把前面字符串的长度补齐到0,或者8的整数倍。最少补1个空格,最多不8个空格。原创 2024-08-01 09:55:26 · 497 阅读 · 0 评论 -
Netty核心原理与基础实战(三)——详解Channel、Handler(备份)
通道是Netty的核心概念之一,代表网路连接,有它负责同对端网络进行网络通信,既可以写入数据到对端,也可以从对端读取数据。AbstractChannel内部有一个pipeline属性,表示处理器的流水线。Netty在对通道进行初始化的时候,将pipiline属性初始化为DefaultChannelPipeline的实例。以上代码表明每个通道都拥有一条ChannelPipeline处理器流水线。AbstractChannel内部有一个parent父通道属性,保持通道的父通道。原创 2024-02-04 10:30:00 · 1715 阅读 · 0 评论 -
Netty核心原理与基础实战(三)——详解Channel、Handler
通道是Netty的核心概念之一,代表网路连接,有它负责同对端网络进行网络通信,既可以写入数据到对端,也可以从对端读取数据。AbstractChannel内部有一个pipeline属性,表示处理器的流水线。Netty在对通道进行初始化的时候,将pipiline属性初始化为DefaultChannelPipeline的实例。以上代码表明每个通道都拥有一条ChannelPipeline处理器流水线。AbstractChannel内部有一个parent父通道属性,保持通道的父通道。原创 2024-02-04 09:30:00 · 1274 阅读 · 0 评论 -
Netty核心原理与基础实战(二)——详解Bootstrap 备份
模式值为-1,表示禁用该功能。因为父通道的内部业务处理是固定的:接收新连接后,创建子通道,然后初始化子通道,所以不需要特别的配置,由Netty自行进行装配。从前文可以,为了及时接收新连接,在服务端,一般有两个独立的反应器,一个负责新连接的监听和接收,另一个负责IO事件轮询和分发,并且两个反应器相互隔离。服务端在处理客户端新连接请求时(三次握手)是顺序处理的,所以同一时间只能处理一个客户端连接,多个客户端到来的时候,服务端将不能处理的客户端连接请求方法队列中等待处理,队列的大小通过SO_BACKLOG指定。原创 2024-02-03 10:33:27 · 889 阅读 · 0 评论 -
Netty核心原理与基础实战(二)——详解Bootstrap
Bootstrap类是Netty提供的一个便利的工厂类,可以通过它来完成Netty的客户端或服务端的Netty组件的组装,以及Netty程序的初始化和启动执行。Netty的官方解释是:完全可以不用Bootstrap类,可以一点点去手动创建通道、完成各种设置和启动注册到EventLoop反应器,然后开始事件的轮询和处理,但是这个过程会非常麻烦。在NEtty中,每一个NioSocketChannel通道所封装的都是Java NIO通道,再往下就对应到了操作系统底层的socket文件描述符。原创 2024-02-03 10:32:26 · 1399 阅读 · 0 评论 -
Netty核心原理与基础实战(一)备份
Netty是一个Java NIO客户端/服务端框架,是一个为了快速开发可维护的高性能、高可扩展的网络服务器和客户端程序而提供的异步事件驱动基础框架和工具。基于Netty,可以快速轻松地开发网络服务器和客户端的应用程序。与直接使用Java NIO相比,Netty给大家造出了一个非常优美的轮子,它可以打打简化网络编程流程。例如,Netty极大地简化了TCP、UDP套接字和HTTP Web服务程序的开发。Netty的目标之一是使通信开发可以做到“快读和轻松”。原创 2024-01-31 11:00:00 · 852 阅读 · 0 评论 -
Netty核心原理与基础实战(一)
Netty是一个Java NIO客户端/服务端框架,是一个为了快速开发可维护的高性能、高可扩展的网络服务器和客户端程序而提供的异步事件驱动基础框架和工具。基于Netty,可以快速轻松地开发网络服务器和客户端的应用程序。与直接使用Java NIO相比,Netty给大家造出了一个非常优美的轮子,它可以打打简化网络编程流程。例如,Netty极大地简化了TCP、UDP套接字和HTTP Web服务程序的开发。Netty的目标之一是使通信开发可以做到“快读和轻松”。原创 2024-01-31 10:00:00 · 1070 阅读 · 0 评论 -
Java 高并发编程——Reactor模式(多线程)备份
Reactor和Handler挤在一个单线程中会造成非常严重的性能缺陷,可以使用多线程来对基础的Reactor模式进行改造。多线程Reactor的演进分为两个方面:1、升级Handler。既要使用多线程,又要尽可能高效率,则可以考虑使用线程池。2、升级Reactor。可以考虑引入多个Selector(选择器),提升选择大量通道的能力。总体来说,多线程版本的Reactor模式大致如下:(1)将负责数据传输处理的IOHandler处理器的执行放入独立的线程池中。原创 2024-01-30 10:30:00 · 981 阅读 · 0 评论 -
Java 高并发编程——Reactor模式(多线程)
为了提升效率,可以让SubReactor的数量和选择器的数量一致,避免多个线程负责一个选择器,导致需要进行线程同步,引起效率低下。2、设计一个新的子反应器(SubReactor)类,子反应器负责查询一个选择器。3、开发多个处理线程,一个处理器负责执行一个子反应器。的基础上完成多线程反应器的升级。1、引入多个选择器。原创 2024-01-30 10:00:00 · 1655 阅读 · 0 评论 -
Java 高并发编程——Reactor模式(单线程)-备份
什么是单线程版本的Reactor模式?简单地说,Reactor和Handlers处于一个线程中执行。这是最简单的Reactor模式。如下图:基于Java NIO如何实现简单的单线程版本的 Reactor模式呢?需要用到SelectionKey(选择键)的几个重要的成员方法:1、void attach(Object o):将对象附件到选择键。此方法可以将任何Java POJO对象作为附件添加到SelectionKey实例。原创 2024-01-29 10:30:00 · 1016 阅读 · 0 评论 -
Java NIO (四)NIO Selector类
选择器是什么?选择器和通道关系是什么?简单的说,选择器的使用是完成IO的多路复用,其主要工作是通道的注册、监听、事件查询。一个通道代表一条连接通路,通过选择器可以同时监听多个通道的IO(输入输出)状况。选择器和通道的关系是监控和被监控的关系。选择器提供了独特的API方法,能够选出(select)所监控的通道已经发生了哪些IO事件,包括读写就绪的IO操作事件。在NIO编程中,一般是一个单线程处理一个选择器,一个选择器可以监控很多通道。所以,通过选择器,一个单线程可以处理成千上万甚至更多的通道。原创 2024-01-22 10:00:00 · 917 阅读 · 0 评论 -
Java NIO (四)NIO Selector类(备份)
选择器是什么?选择器和通道关系是什么?简单的说,选择器的使用是完成IO的多路复用,其主要工作是通道的注册、监听、事件查询。一个通道代表一条连接通路,通过选择器可以同时监听多个通道的IO(输入输出)状况。选择器和通道的关系是监控和被监控的关系。选择器提供了独特的API方法,能够选出(select)所监控的通道已经发生了哪些IO事件,包括读写就绪的IO操作事件。在NIO编程中,一般是一个单线程处理一个选择器,一个选择器可以监控很多通道。所以,通过选择器,一个单线程可以处理成千上万甚至更多的通道。原创 2024-01-22 11:00:00 · 942 阅读 · 0 评论 -
Java NIO (二)NIO Buffer类的重要方法
在使用Buffer实例前,我们需要先获取Buffer子类的实例对象,并且分配内存空间。需要获取一个Buffer实例对象时,并不是使用子类的构造器来创建,而是调用子类的allocate()方法。本例中,IntBuffer是具体的Buffer子类,通过调用IntBuffer.allocate(20)创建了一个intBuffer实例对象,并且分配了20*4字节的内存空间。运行程序后,通过输出结果,可以查看一个新建缓冲区实例对象的主要属性值。原创 2024-01-17 07:34:28 · 1105 阅读 · 0 评论 -
Java NIO (一)简介
在1.4版本之前,Java NIO类库是阻塞IO,从1.4版本开始,引进了新的异步IO库,被称为Java New IO类库,简称为Java NIO。New IO类库的目的 就是要让Java支持非阻塞IO。Java NIO类库包含三个核心组件:1、Channel(通道)2、Buffer(缓冲区)3、Selector(选择器)理解了上一章,大家会马上识别出来Java NIO属于第三种模型——IO多路复用模型。只不过,Java NIO组件提供了统一的API,为大家屏蔽了底层的操作系统的差异。原创 2024-01-16 08:27:34 · 1528 阅读 · 0 评论 -
高并发IO底层原理
IO底层原理是隐藏在Java编程知识之下的基础知识,是开发人员必须掌握的基本原理。本文从操作系统的底层原理入手,通过图文的方式为大家深入剖析高并发IO的底层原理,并介绍如何通过设置来让操作系统支持高并发。原创 2024-01-15 08:29:38 · 1310 阅读 · 0 评论 -
Java多线程技术11——ThreadPoolExecutor类的使用2
public boolean isShutdown()方法的作用是判断线程池是否已经关闭由运行结果可知,只要调用了shutdown()方法,isShutdown()方法的返回值就是true。原创 2024-01-07 20:39:28 · 1181 阅读 · 0 评论 -
Java多线程技术11——ThreadPoolExecutor类的使用1
ThreadPoolExecutor类可以非常方便的创建线程池对象,而不需要程序员设计大量的new实例化Thread相关的代码。原创 2024-01-07 10:52:44 · 1003 阅读 · 0 评论 -
Java多线程技术10——线程池ThreadPoolExecutor之Executor接口
Executor接口结构非常简单,仅有一个方法。/***/但Executor是接口,不能直接使用,所以还需要实现类。ExecutorService接口是Executor子接口,在内部添加了比较多的方法。虽然ExecutorService接口添加了若干个方法的定义,但还是不能实例化,那么就要看看它的唯一子实现类AbstractExecutorService。由于AbstractExecutorService是抽象类,所以同样不能实例化。原创 2024-01-04 23:15:51 · 1141 阅读 · 0 评论 -
Java多线程技术9——非阻塞队列
非阻塞队列的特色是队列里面没有数据时,返回异常或null。在JDK的并发包中,常见的非阻塞队列有:ConcurrentHashMap、ConcurrentSkipListMap、ConcurrentSkipListSet、ConcurrentLinkedQueue、ConcurrentLinkedDeque、CopyOnWriteArrayList、CopyOnWriteArraySet。本篇将介绍这7个非阻塞队列的特点与使用。原创 2024-01-03 12:49:21 · 1420 阅读 · 0 评论 -
Java多线程技术8——并发集合框架
Java中的集合框架父接口是Iterable,从这个接口向下一一继承就可以得到完整的Java集合框架结构。集合框架的继承与实现关系相当复杂,简化的集合框架接口结构如下图:可以发现,出现了3个继承分支(List,Set,Queue)的结构是接口Collection,它是集合框架主要功能的抽象。另一个接口是Iterable。原创 2023-12-28 08:52:41 · 536 阅读 · 0 评论 -
Java多线程技术7——线程组
为了方便对某些相同功能的线程进行管理,我们可以把线程归属到某一个线程组。线程组中可以有线程对象、线程,类似树的形式,效果如下图:线程组的作用是可以批量地管理线程或线程对象,有效地对线程或线程对象进行组织。原创 2023-12-27 11:00:00 · 446 阅读 · 0 评论 -
Java多线程技术六——线程的状态
线程在不同的运行时期存在不同的状态,状态信息在存在于State枚举类中,如下图。每个状态的解释如下图调用于线程有关的方法是造成线程状态改变的主要原因,因果关系如下图从上图可知,在调用与线程有关的方法后,线程会进入不同的状态。这些状态之间有些是双向切换,比如WAITING和RUNNING状态之间可以循环地进行切换,而有些是单向切换,比如线程销毁(TERMINATED状态)后,并不能自动进入RUNNING状态。下面将对6中线程状态用代码的方式进行验证。原创 2023-12-26 07:34:37 · 1046 阅读 · 0 评论 -
Java多线程技术五——单例模式与多线程-备份
本章的知识点非常重要。在单例模式与多线程技术相结合的过程中,我们能发现很多以前从未考虑过的问题。这些不良的程序设计如果应用在商业项目中将会带来非常大的麻烦。本章的案例也充分说明,线程与某些技术相结合中,我们要考虑的事情会更多。在学习本章的过程中,我们只需要考虑一件事情,那就是:如果使单例模式与多线程结合时是安全、正确的。原创 2023-12-25 12:15:12 · 1361 阅读 · 0 评论 -
Java多线程技术五——单例模式与多线程
本章的知识点非常重要。在单例模式与多线程技术相结合的过程中,我们能发现很多以前从未考虑过的问题。这些不良的程序设计如果应用在商业项目中将会带来非常大的麻烦。本章的案例也充分说明,线程与某些技术相结合中,我们要考虑的事情会更多。在学习本章的过程中,我们只需要考虑一件事情,那就是:如果使单例模式与多线程结合时是安全、正确的。原创 2023-12-25 11:14:49 · 1388 阅读 · 0 评论 -
Java多线程技术四——定时器
在JDK库中Timer类主要负责计划任务的功能,也就是在指定的时间开始执行某一个任务,Timer类的方法列表如下:Timer类的主要作用就是设置计划任务,封装任务的类却是TimerTask,该类的结构如下图因为TimerTask是一个抽象类,所以计划执行的代码要放入Timer-Task的子类中。原创 2023-12-23 21:23:33 · 909 阅读 · 0 评论 -
Java多线程技术三:锁的使用——使用ReentrantReadWriteLock类
ReentrantLock类具有完全互斥排它的特点,同一时间只有一个线程在执行ReentrantLock.lock()方法后面的任务,这样做保证了同时写实例变量的线程安全性,但 效率是非常低下的。在JDK提供了一种读写锁ReentrantReadWriteLock类,可以在同时进行读操作时不需要同步执行,提升运行速度,加快运行效率。这两个类之间没有继承关系。读写锁表示有两个锁,一个是读操作相关的锁,也叫共享锁。另一个是写操作相关的锁,也叫排它锁。原创 2023-12-20 11:36:04 · 1292 阅读 · 0 评论 -
Java多线程技术三:锁的使用——使用ReentrantLock类-2
public final int getQueueLength()方法 的作用是返回正等待获取此锁线程的估计数,比如有5个线程,1个线程长时间占有锁,那么在调用getQueueLength()方法后的返回值是4,说明有4个线程同时在等待锁的释放。非公平锁采用“有机会插队”的策略,一个线程获取锁之前,要先去尝试获取锁,而不是在队列中等待,如果成功获取锁,说明线程虽然是后启动的,但先获得了锁,这就是“插队”效果,如果获取锁没有成功,那么将自己追加到队列中进行等待。下面创建非公平锁测试的运行类。原创 2023-12-19 10:16:15 · 1064 阅读 · 0 评论 -
Java多线程技术三:锁的使用——使用ReentrantLock类-1
在Java多线程中可以使用sunchronzied关键字来实现线程间同步,不过在JDK1.5中新增的ReentrantLock类也能达到同样的效果,并且在扩展功能上更加强大,比如具有嗅探锁定‘多路分支通知等功能。原创 2023-12-18 07:32:37 · 1067 阅读 · 0 评论 -
Java多线程技术二:线程间通信——InheritableThreadLocal的使用
使用InheritableThreadLocal可以在子线程中取得父线程继承下来的值。原创 2023-12-07 13:14:27 · 1203 阅读 · 0 评论 -
Java多线程技术二:线程间通信——ThreadLocal的使用
执行后每个线程中的Map就存储自己的数据,Map中的key存储的是ThreadLocal对象,value就是存储的值,说明ThreadLocal和值之间是一对一的关系,一个ThreadLocal对象只能关联一个值。ThreadLocal类主要的作用就是将数据放入当前线程对象中的Map里,这个Map类是Thread类的实例变量。变量值的共享可以使用public static 的声明方式,所有的线程都是用同一个public static变量,那如果想实现每一个线程都有自己的变量该如何解决呢?原创 2023-12-05 12:50:30 · 1576 阅读 · 1 评论 -
Java多线程技术二:线程间通信——join()方法的使用
在很多情况下,主线程创建并启动子线程,如果子线程中要进行大量的耗时运算,主线程往往将早于子线程结束,这时如果主线程想等待子线程执行完成后再结束,例如子线程处理一个数据,主线程要取到这个数据中的值,这个时候要用到join()方法。join()方法的作用是等待线程对象销毁。原创 2023-12-04 12:12:30 · 721 阅读 · 0 评论 -
Java多线程核心技术一:volatile关键字
volatile关键字在使用上有3个特性:1、可见性:B线程能马上看到A线程更改的数据。2、原子性:volatile原子性体现在赋值原子性,在32位JDK中对64位数据类型执行赋值操作时会写两次,高32位和低32位,如果写两次的这组操作被打断,导致写入的数据被其他线程的写操作所覆盖,获得错误的结果,就是非原子性的。如果写两次的操作是连续的,不允许被打断,就是原子性的。原创 2023-11-30 13:15:44 · 1148 阅读 · 0 评论 -
Java多线程核心技术一-多线程基础其他内容
出现这种情况就是因为String的两个值都是"AA",两个线程是持有相同的锁,造成线程B不能执行。这就是String常量池所带来的问题,所以大多数情况下,同步synchronzied都不使用String作为锁对象,而改用其他的。例如 new Object()实例化一个新的object对象时,它并不放入缓存池中,或者执行new String()创建不同的字符串对象,形成不同的锁。在把synchronzied(string)同步块与String联合使用时,要注意常量池会带来一些意外。原创 2023-11-30 07:07:33 · 1080 阅读 · 0 评论 -
Java多线程核心技术一-基础篇synchronzied同步语句块
用synchronzied关键字声明方法在某些情况下是有弊端的,比如A线程调用同步方法执行一个长时间的任务,那么B现成就要等待比较长的时间,此时可以使用synchronzied同步语句块来解决,已增加运行效率。synchronzied方法是将当前对象作为锁,而synchronzied代码块是将任意对象作为锁。锁可以认为是一个标识,持有这个标识的线程就可以执行被同步的代码。原创 2023-11-29 12:02:56 · 882 阅读 · 0 评论 -
Java多线程核心技术一-基础篇synchronzied同步方法
关键字synchronzied保障了原子性、可见性和有序性。非线程安全问题会在多个线程对同一个对象中的同一个实例变量进行并发访问时发生,产生的后果就是“脏读”,也就是读取到的数据其实是被更改过的。而线程安全是指获取的实例变量的值是经过同步处理的,不会出现脏读的现象。本篇将细化线程并发访问的内容,在细节上更多讲解并发时变量值的处理方法。原创 2023-11-28 11:31:00 · 1036 阅读 · 0 评论