Java
FlowingRiver
这个作者很懒,什么都没留下…
展开
-
springboot 日志没有记录异常
背景springboot项目,放到服务器上跑,定时任务运行过程中中断,查看日志却发现没有报错。在本地跑,发现控制台能打印报错信息,而日志也没有记录报错。经排查,发现是因为报错出现在线程池中,没有在日志中记录。原先使用线程池:ExecutorService executorService = Executors.newFixedThreadPool(15);解决新建类继承ThreadPoolExecutor,重写afterExecute方法。@Slf4jpublic class TaskE原创 2021-04-07 16:04:00 · 3980 阅读 · 1 评论 -
接受32960报文遇到TCP粘包\拆包问题及解决
接受32960协议的报文,服务端使用Netty。报文协议如下:可知每帧报文之间是以0x23,0x23(即##)分割的。对于TCP粘包/拆包问题,一开始使用DelimiterBasedFrameDecoder解码获取每帧报文,如下: pipeline.addLast( new DelimiterBasedFrameDecoder(64 * 1024, Unpooled.copiedBuffer("##".getBytes())) );实际测试过程中发原创 2021-01-28 14:18:02 · 1582 阅读 · 3 评论 -
zip4j:一个好用的java压缩/解压工具
近期项目遇到解压zip文件的需求,想着用java.util.zip.ZipFile来实现,又觉得这一套挺繁琐,有没有现成的轮子可以用呢?网上搜索了一番,找到了一个Zip4j的库,一下被其简洁的调用所吸引。用到项目中:在pom中引入: <dependency> <groupId>net.lingala.zip4j</groupId> <artifactId>zip4j</art原创 2020-05-20 15:46:44 · 1001 阅读 · 0 评论 -
使用Jedis操作Redis数据库
在项目中需要用到Redis数据库,这里记录下Jedis的使用。定义一个RedisUtil类。public class RedisUtil{ static JedisPool pool;}1.连接池为减少创建和销毁连接的成本,一般都会用连接池管理连接,连接池的创建如下: /** * 获取jedis连接池 */ static JedisPool getPool() { if (pool == null) { //创建je原创 2020-05-12 10:09:18 · 594 阅读 · 0 评论 -
Java集合框架梳理
PriorityQueueTreeMap原创 2020-04-10 15:22:42 · 163 阅读 · 0 评论 -
Java中的优先队列PriorityQueue
翻译自callicoderJava中的优先队列是一种特殊类型的队列,其中所有的元素在创建时都以其自然序或者提供的自定义的Comparator排序。优先队列的队头包含最小序的元素(根据指定的排序规则),而队尾包含最大序的元素。因此,当你从优先级队列中删除元素时,根据指定排序规则的最小元素会首先被移除。创建一个优先队列这里创建一个整数型的优先队列并且添加一些元素进去。添加完后,我们一个...翻译 2020-03-20 10:04:47 · 1020 阅读 · 0 评论 -
Java中的TreeMap
翻译自callicoderJava中的TreeMap是基于红黑树的一种队Java Map接口的实现。TreeMap里的entry对象会以key的自然序,或者在创建TreeMap时自定义的Comparator排序。TreeMap 是Java Collection框架的一部分。它实现了NavigableMap接口,后者继承自SortedMap接口。下面是TreeMap的阶层图。SortedMa...翻译 2020-04-08 10:36:11 · 485 阅读 · 0 评论 -
hashmap按值排序
常会有这样的需求,这里记录下。有个map: Map<Integer,Integer> map = new HashMap<>(); map.put(1,5); map.put(3,4); map.put(2,4);对其排序:拿出map中的Entry成为一个列表调用列表sort方法,传入ComparatorComp...原创 2020-02-24 09:28:25 · 835 阅读 · 0 评论 -
java Integer List转为int型数组
可用lambda表达式转换:import java.util.Arrays;import java.util.List;class ListUtil{ public static void main(String args[]) { List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); int[] arr= lis...原创 2020-01-14 13:38:46 · 10054 阅读 · 1 评论 -
Cannot call sendError() after the response has been committed
一个下载文件的方法,每次文件都能成功下载,但控制台总会报错: Cannot call sendError() after the response has been committed Could not find acceptable representation虽然不妨碍下载功能的使用,但总报错让人心烦。参考了这篇文章,原来是输出流关掉后还在return导致的。去掉re...原创 2019-08-20 10:39:12 · 2503 阅读 · 0 评论 -
java中的可重入锁ReentrantLock
翻译自geeksforgeeks。背景在Java中实现线程同步的传统方法是使用synchronized关键字。虽然它提供了基本同步功能,但synchronized的使用比较死板。比如说,一个线程只能锁一次。同步块不提供任何等待队列的机制,并且在一个线程退出后,任何线程都可以获取锁。这可能导致很长一段时间内某些其他线程的资源匮乏。Java中提供了可重入锁(ReentrantLock),以提...翻译 2019-03-04 12:50:27 · 1089 阅读 · 0 评论 -
Java中的信号量Semaphore
翻译自geeksforgeeks。信号量Semaphore 通过使用计数器counter来控制对共享资源的访问。如果计数器大于零,则允许访问。如果为零,则拒绝访问。计数器对共享资源的访问许可进行计数。因此,要访问资源,线程必须要从信号量得到许可。信号量如何工作一般而言,当一个线程需要访问共享资源时,需要获得许可,这里就要用到信号量Semaphore 。如果信号量的计数count大于零,则...翻译 2019-02-26 12:26:36 · 770 阅读 · 0 评论 -
JVM如何工作? - JVM架构
翻译自geeksforgeeks。JVM(Java虚拟机)充当运行Java应用程序的运行时引擎的角色。JVM实际上是调用java代码中的main方法的。JVM是JRE(Java运行时环境)的一部分。Java应用程序号称WORA(Write Once Run Anywhere):一次编写,到处运行。这意味着程序员可以在一个系统上开发Java代码,并且可以期望它在任何其他支持Java的系统上运行而...翻译 2019-03-01 11:06:03 · 262 阅读 · 0 评论 -
Java中的volatile关键字
翻译自geeksforgeeks使用volatile是保证线程安全的另一种方式(如同步,原子包装)。线程安全意味着多个线程可以同时使用方法或类实例而不会出现任何问题。考虑下面的简单的例子:class SharedObj{ // Changes made to sharedVar in one thread // may not immediately reflect in ot...翻译 2019-02-28 16:27:12 · 164 阅读 · 0 评论 -
Java 语言如何实现线程间通信
翻译自TutorialDocs虽然通常每个子线程只需要完成自己的任务,但有时我们可能希望多个线程一起工作来完成一个任务,这就涉及到线程间的通信。本文会涉及到的方法和类有:thread.join(), object.wait(), object.notify(), CountdownLatch, CyclicBarrier, FutureTask, Callable等。本文涉及到的代码可在这里...转载 2019-02-21 14:43:37 · 243 阅读 · 0 评论 -
Java类实例化顺序总结
直接上一段代码:public class LoadOrder { public static void main(String[] args) { Son son = new Son(); System.out.println(&quot;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&amp;amp;&原创 2019-01-04 12:12:09 · 265 阅读 · 0 评论