- 博客(111)
- 收藏
- 关注
原创 【无标题】
B接口只有简单逻辑,当超过10个请求访问A时,10个线程池都在A中,并且要请求B,这时由于没有空闲线程,因此对于B的请求进入了排队队列里,这时就形成了死锁。2.对文件名进行取模,如果文件名含有中文,可以进行base64编码或者其他,然后再进行运算,然后每个机器处理一部分: 两个机器,则对2取模,A机器处理0,B机器处理1的。可以是加一个时间戳后缀;当多线程处理时,就要考虑锁的问题,这里用一个简单的方案:就是对文件以重命名的方式进行锁。2.对于同个线程池的服务,以函数调用的形式,而不是以接口的形式。
2024-03-29 16:20:41
375
原创 多线程demo
*** 自定义线程池/*** 任务队列-使用阻塞队列throw new RuntimeException("线程池大小至少为1");i < size;i ++) {throw new RuntimeException("线程池大小至少为1");i < size;i ++) {try {//获取排队队列的任务,如果没有则阻塞,直到有任务进来 run = queue . take();i < 10;
2023-04-11 17:42:16
160
原创 自定义非公平锁-demo
先竞争资源看看能否获得锁,如果不能则进入队尾进行排队,并且该线程阻塞,以免一直在while循环中运行占用cpu资源。因为当竞争锁时如果直接获得锁,不会进入排队队列,因此释放锁时需要判断。进行释放锁操作,先把当前线程的资源释放,然后再唤醒队列的头部。当调用unlock时。
2023-04-04 14:15:36
155
原创 centos-sftp
之后就可以使用sftp 用户@ip 进行登录了,并且只能在/sftp/sftpuser目录下操作,但是无法使用ssh进行登录,只能使用su命令(暂时没找到资料)#注释Subsystem sftp /usr/libexec/openssh/sftp-server。2.创建sftpuser用户,-g指定用户组 -M 不新建家目录,-s /bin/false 不能登录ssh。ssh 版本在4.8之后可以通过配置令sftp只能在特定目录下操作,ssh -V 检查ssh版本。5.建立文件存放目录。
2023-01-05 11:13:06
1121
原创 tomcat探究三使用连接器(参考tomcat4)
写好测试类后,可以发请求进行测试 http://localhost:8080/servlet/TestControllerServlet。连接器就是管理连接的,可以理解为连接池–现在都是使用这个;HttpRequestFacade – 提供外部操作请求对象。HttpHeader–存储请求头部分的信息,暂时没用到。HttpConnector–连接器,管理请求的。HttpRequestLine–存储请求行信息。HttpProcessor–请求处理。HttpRequest–请求对象。
2022-10-08 15:38:29
473
原创 tomcat探究二搭建简单的servlet容器
TestControllerServlet:模拟测试类,实现servlet接口。Request:对请求报文做处理,获取http请求报文第一行的资源路径。ServletProcessor:请求servlet资源的处理。HttpServer:容器服务入口,监听一个端口。Response:延续 探究一 的内容。Servlet:自定义servlet。在同一个包还可以创建其他类似的类。
2022-09-29 17:23:09
352
原创 tomcat探究一搭建简单的web容器
Request对请求进行处理,拿到http请求报文,获取第一行,拿到请求资源路径。HttpServer作为web入口,监听一个端口,作为web的入口。Response对响应进行处理,返回静态资源或者错误信息。这里的web程序只是一个静态资源的web程序。
2022-09-29 17:09:46
149
原创 简单记录使用org.slf4j.MDC进行日志追踪
d{yyyy-MM-dd HH:mm:ss.SSS} : 是时间格式。%logger{15}:%line : 在哪个类,并且显示行号。%X{TraceId}:自定义的一个唯一线程请求id。%m%n :输出信息并换行。这里使用的是log4j2。%thread:线程名称。[%p] : 日志级别。
2022-09-26 17:27:08
1310
原创 字符串的编码格式转换
主要的思路就是先将字符串正常化,然后就可以按照指定编码进行编码解码。开发工具是STS,默认的编码格式是UTF-8。本次主要是UTF-8和GBK之间的相互转换。
2022-08-18 17:11:22
4822
原创 基础排序算法
排序算法快速排序选择排序归并排序插入排序基本概念:代码:快速排序选择排序归并排序插入排序基本概念:通过一趟排序将记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的代码:/**** * 快速排序 * @throws Exception */ @Test public void testQuickSort() throws Exception{ int[] arr = {3, 44, 38,
2022-06-28 11:07:12
111
原创 socket流的关闭
在使用socket进行全双工通信时,原本以为输入流和输出流是分开关闭的,然而不管关闭哪个都会直接关闭socket;可以使用socket.shutdownInput()和socket.shutdownOutput()客户端使用InputStream进入bebug模式,在执行到 inputStream.close()后进入SocketInputStream的close()方法,而这个方法是关闭socket流执行reader.close()后,最后也是执行SocketInputStream的close(
2022-06-15 11:17:56
2722
原创 java socket
单向通信就是一方发,一方收例如下面的代码就是客户端发,服务端收服务端处理类客户端半双工简介可双向通信就是,但是一次只能有一方发送服务端处理客户端全双工简介服务端和客户端可以同时发送数据...
2022-06-14 22:56:54
509
原创 Redis分布式锁的初实现
Redis分布式锁的初实现思路测试代码思路使用setnx 命令setnx命令当key不存在时,会set进去,当已存在则返回falseset完之后使用 exprie命令对key设置过期时间释放锁的时候主动调用del释放锁测试代码public static void main(String[] args) { ExecutorService executorService = Executors.newFixedThreadPool(10); Random random = new Ran
2022-03-17 18:18:27
1316
2
原创 redis插入大量key
redis插入大量key工具代码顺序插入多线程&资源池插入使用pip测试结果工具代码import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicInteger;import redis.clients.jedis.Jedis;i
2022-03-17 16:18:47
2925
原创 RabbitMQ初使用
RabbitMQ地址使用Docker安装个人简单总结java代码使用hello word流程生产者消费者Work queues流程生产者消费者消费者1消费者2Publish/Subscribe流程生产者消费者Routing流程生产者消费者Topics流程生产者消费者地址官方地址:https://www.rabbitmq.com官方代码demo地址:https://www.rabbitmq.com/getstarted.html使用Docker安装docker安装RabbitMQdocker pu
2022-03-14 17:38:34
3360
转载 字符串专项练习1
字符串专项练习1字符串反转字符串整数反转字符串中的第一个唯一字符有效的字母异位词验证回文串字符串反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。class Solution { public void reverseString(char[] s) { if(s.length == 1){ return ;
2022-03-14 17:00:47
118
转载 数组专题练习2
数组专题两数之和加一移动零两数之和 /*** * 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 * 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 * 逻辑: * 遍历一遍数组,使用哈希表记录数组元素的值 * 遍历元素时,使用目标值减去该值,并判断哈希表中是否存在需要的值 * @param nums * @param target
2022-03-14 16:47:23
128
原创 构造二叉搜索树
节点public class TreeNode { int val; TreeNode right; TreeNode left; public TreeNode() {}; public TreeNode(int val) { this.val = val; } public int getVal() { return val; } public void setVal(int val) { this.val = val; } public TreeNo
2022-03-08 15:43:49
336
原创 redis 消息队列
redis stream基本使用redis操作listpub/substreamjava Jedismaven依赖list生产者消费者pub/sub生产者消费者监听消费stream生产者消费者redis操作list基本使用从左边入队lpus从左边出队lpop从右边入队rpush从右边出队rpop查询长度llen keypub/subPUBLISH channel message //将信息 message 发送到指定的频道 channelPUBLISH channel
2022-03-08 11:46:39
540
原创 简单链表操作-java实现
链表操作节点结构链表队列节点结构class Node{ int val; Node next; public int getVal() { return val; } public void setVal(int val) { this.val = val; } public Node getNext() { return next; } public void setNext(Node next) { this.next = next; } public No
2022-03-05 22:24:10
410
原创 bitmap练习
/*** * 自定义工具类 * */public class BitMapUtil { /*** * 存储数组 */ private int[] bitArray; private static final StringBuffer STRING_BUFFER = new StringBuffer(); public BitMapUtil(long size) { bitArray = new int[(int)(size/32+1)]; } /** * 将数
2022-03-04 13:49:13
104
原创 顺序存储结构-java实现
顺序存储结构列表--整型列表--泛型队列测试用例列表–整型/*** * 列表 */class MyList{ Integer[] vals = null; int size = 0; public MyList() { vals = new Integer[10]; } public MyList(int size) { this.vals = new Integer[size]; } /*** * 获取长度 */ public int length() {
2022-03-03 11:19:45
216
原创 使用redis简单模拟抢购
使用redis简单模拟抢购使用inc自增使用队列使用inc自增/*** * 测试redis inc并发 * */public class RedisThreadInc { private static AtomicInteger SUCCESS = new AtomicInteger(1); //原子操作类 private static Random random = new Random();//生成随机结果 public static void main(String[] ar
2022-02-24 16:35:28
660
原创 Comparator基础使用
class SortTest{ int index; int count; public SortTest(int index,int count) { this.index = index; this.count = count; } }Arrays.sort(st, new Comparator<SortTest>() { /**** * o1 后一个数 * o2 前一个数 * * 0 不排序 * -1
2022-02-22 17:02:29
201
原创 在4G文件中查询出出现频率最多的数
生成测试文件import java.io.BufferedOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.OutputStream;import java.util.Random;public class WriteBigFile { public static void main(String[] args) throws Exception { long star
2021-11-17 15:49:12
274
原创 BufferedOutputStream 自动刷新缓冲区
BufferedOutputStream需求背景代码结果源码探究需求背景使用BufferedOutputStream 写文件,考虑到这个有缓冲区,因此想要试一下,当缓冲区满了之后会怎么样?1.自动刷新2.报错代码public static void main(String[] args) throws Exception { File file = new File("D:\\test.txt"); OutputStream out = new FileOutputStream(file
2021-11-11 11:44:29
764
1
原创 linux 标准输入输出、标准错误
标准输入(STDIN) - 缺省为键盘 —0标准输出(STDOUT) - 默认为终端窗口 ----1 --一般默认标准错误(STDERR) - 默认为终端窗口 ----2例子:ls > test.txt //将ls命令的 输出 重定向到 test.txt (标准输出重定向)ls >> test.txt 2>&1将ls命令的输出重定向到 test.txt 如果出现错误则重定向到标准输出,而标准输出是重定向到test.txt的因此这里标准输出&am
2021-11-11 11:33:12
1201
转载 数组专题练习
数组删除排序数组中的重复项买卖股票的最佳时机旋转数组存在重复元素只出现一次的数字删除排序数组中的重复项 /*** * 1、给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。 * 逻辑: * 由于是有序数组,因此使用可以直接使用指针 * 定义一个指针,指向的是真实的数组长度 * 遍历数组时,当遇到相同的元素,则进行跳过,当遇到不同的元素时,将指针往后移动一位,并将新的元素填入 * 最后需要将指针+1--数组长度的数组下标
2021-10-30 22:21:29
130
原创 简单会话追踪实现
会话追踪1.需求简单的做法说明1.需求当后端生成一个请求时,需要清楚该请求调用了哪些服务端接口,而服务端接口再调用了哪些接口简单的做法当有请求过来时,在后端生成一个id;并将该id作为参数传递下去; 每次调用接口都会默认将该参数带上服务端同理,当没有检测到改id时可以自己创建一个;防止有些请求不是在后端进行调用*每次调用接口前或者调用后都应该有日志记录*请求id的规则可以自己设定;可以是一个id一直传递下去也可以是其他的规则;说明该方法可以简单的实现,追踪请求的调用接口情况;但是不能够清楚
2021-10-24 17:01:42
106
原创 使用位运算计算和
public static void main(String[] args) { int sum = getBitSum(100,200); System.out.println(sum); } //a^b 不进位相加 //(a&b) <<1 进位 //(a^b) ^ ((a&b) <<1) 进位相加 //为什么需要循环呢, //因为当把进位相加后,有可能产生新的进位,因此只有当进位为0的时候才是加完了; public static int .
2021-10-24 16:49:05
83
原创 可怜的小猪--进制数的妙用
可怜的小猪--进制数的妙用题目代码解题逻辑题目有1000个桶,有且仅有一个桶里面装了毒药,其他的都装了水。这些桶从外面看上去完全相同。如果一只猪喝了毒药,它将在15分钟内死去。在一个小时内,至少需要多少只猪才能判断出哪一个桶里装的是毒药呢?代码 /*** * @param buckets 桶的数量 * @param minutesToDie 毒药发作时间 * @param minutesToTest 最短测试时间 * @return */ public static in
2021-05-26 17:02:08
166
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人