javase
文章平均质量分 52
Allen Wu(WU, ZHWIEI)
keep learning
展开
-
nested exception is javax.net.ssl.SSLandshakeException: PKIX path building failed:
PKIX path building failed原创 2022-10-27 19:09:46 · 414 阅读 · 2 评论 -
异步CompletableFuture操作优化IO 密集型API接口,线程池监控
继上一篇异步操作优化IO 密集型API 接口,这一篇将会加上自定义线程池和对线程池的监控,用到springboot的actuator/health。前面提到用CompletableFuture来优化接口,其实CompletableFuture内部自己维护了一个线程池,这个线程池的个数是电脑核心数-1,显然这个并不适合IO密集型的API。原因是IO密集型的API有很多IO的操作,比如call DB,call third API等等,最大的瓶颈就是IO的等待时间,这是要把尽可能多的请求发出去,然后我们API就等原创 2021-06-16 16:25:32 · 639 阅读 · 0 评论 -
Sqlserver Date类型为空,数据库中存储1900-01-01解决方法
今天在做一个存储操作的时候发现有个字段create_date的值为1900-01-01,这个数据非常可疑,然后我去查看前端传来的参数是这样"creation_date": ""VO中的字段:@JsonProperty("creation_date")private String creationDate;PO的中的字段:@Column(name="creation_date")private String creationDate;这里解释下为什么用String类型来传时间,因为只要原创 2021-04-01 17:51:28 · 3793 阅读 · 0 评论 -
IDEA这样配置注释模板,让你高出一个逼格!!
原文:https://mp.weixin.qq.com/s/mU4LKBTbFfN1mX9RIJfmVg一、类注释打开 IDEA 的 Settings,点击 Editor–>File and Code Templates,点击右边 File 选项卡下面的 Class,在其中添加图中红框内的内容:/**@author jitwxs@date YEAR年{YEAR}年YEAR年{MONTH}月${DAY}日 ${TIME}*/在我提供的示例模板中,说明了作者和时间,IDEA 支持的所有转载 2021-03-21 10:47:12 · 1646 阅读 · 0 评论 -
CompletableFuture中,怎样确保异步执行的thenAccept能执行完
在我们的日常开发中我们会经常用到异步代码来提升我们api的性能,也有这样的场景,比如我们在A异步操作后,取得A的结果后,又需要进行B操作。借助java8的CompletableFuture,代码如下public class Java8Test { public static void main(String[] args){ CompletableFuture firstFuture = CompletableFuture.supplyAsync(()->{原创 2021-03-03 16:05:13 · 7772 阅读 · 2 评论 -
单元测试UT的一点总结
步骤:前言1,测试类上打注解@RunWith(SpringJUnit4ClassRunner.class)2,mock对象3,测试方法上打注解@Test4,调用测试的方法5,org.junit下的Assert类来比较返回的是否符合我们预期。这样就完成了一个简单的单元测试。补充:对restTemplate.exchange进行mock,这里很不好mock,因为比较难匹配上参数,只有参数匹配到了才会返回我们实现设置好的结果。注意:前言有很多同学喜欢用@springbootTest这个注解来写单元测试,在我看原创 2021-03-02 16:54:16 · 693 阅读 · 0 评论 -
YYYY/MM/dd 日期format的幺蛾子
看网上大佬文章的时候,发现YYYY/MM/dd 和yyyy/MM/dd是不同的,而且YYYY/MM/dd 会出现年份的bug,下面直接上代码@org.junit.Test public void dateYYYY(){ LocalDate date = LocalDate.of(2020,12,27); DateTimeFormatter format1 = DateTimeFormatter.ofPattern("YYYY/MM/dd"); Str原创 2021-01-15 15:09:53 · 568 阅读 · 2 评论 -
异步操作优化接口性能,可提升数倍
背景:在我们日常的开发中,很多时候我们的接口会有比较复杂的逻辑,比如说在一个接口中我们可能要去查询N次数据库来获得我们想要的数据,然后做一些逻辑运算,参数拼装等,还可能调用第三方的api,在其中很多操作其实是没必要串行的,这是我们可以通过并行也就是异步来优化我们接口的。比如有这样的场景,我们需要去调用三个第三方的api获取结果后并且相加,每个api大概需要花2s代码:public int getA(){ try { Thread.sleep(2000);原创 2021-01-14 16:50:18 · 470 阅读 · 0 评论 -
多线程异常处理机制
多线程异常处理机制thread异常处理FutureTask异常处理ThreadPoolExcutor线程池的异常处理:使用execute提交线程的情况thread异常处理FutureTask异常处理ThreadPoolExcutor线程池的异常处理:使用execute提交线程的情况这种情况如果我们没有在线程内捕获异常那么JVM会调用Thread的UncaughtExceptionHandler的uncaughtException方法来处理异常,这是我们可以自己写逻辑覆盖其方法public cl原创 2021-01-13 18:16:25 · 177 阅读 · 0 评论 -
使用parallelStream时,容易忽略的线程安全问题
当我们在使用parallelStream去开启多线程处理任务的时候,在需要得到最终处理结果会出问题。举个栗子。。。public static void main(String[] args) throws InterruptedException { List<Integer> list = new ArrayList(); List<Integer> list1 = new ArrayList(); for (int i = 0;原创 2020-12-09 11:32:51 · 1736 阅读 · 4 评论 -
使用springboot restTemplate,不能拿到详细的error信息解决办法
方法我们在使用restTemplate的时候如果catch Exception。其实我们拿不到具体的错误信息,我们需要catch HttpStatusCodeException。具体使用try{ responseEntity = restTemplate.exchange(apiUrl , HttpMethod.POST, entity, String.class); if(HttpStatus.OK.equals(responseEntity.getS原创 2020-12-08 16:50:03 · 536 阅读 · 0 评论 -
java实现动态加载jar包中的class(破坏双亲委派来实现)
背景最近在项目中在使用Drools来做规则,drools确实功能比较强大,但是学习成本也比较高,语法比较繁琐。我们项目是做的动态规则,用户可以通过上传jar包的方式来动态的再我们ruleengine service中生成规则,然后通过restful的方式来rule规则。在jar包中包含了需要用户自定义的pojo和用户配置的excel,这个excel就是drools的desicion table,有兴趣的可以去drool了解,这里不做过多的描述。遇到的问题上面讲了一个规则jar包中包含了pojo,那么比原创 2020-05-09 19:12:04 · 621 阅读 · 1 评论 -
SimpleDateFormat的线程安全性问题的四种解决方法
在日常开发中,我们经常会用到时间,我们有很多办法在Java代码中获取时间。但是不同的方法获取到的时间的格式都不尽相同,这时候就需要一种格式化工具,把时间显示成我们需要的格式。最常用的方法就是使用SimpleDateFormat类。这是一个看上去功能比较简单的类,但是,一旦使用不当也有可能导致很大的问题。在阿里巴巴Java开发手册中,有如下明确规定:那么,本文就围绕SimpleDateFor...转载 2020-04-19 12:24:48 · 5175 阅读 · 3 评论 -
读懂进程线程、同步异步、阻塞非阻塞、并发并行
1 进程和线程进程(Process):是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源。一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括一个或多个线程。线程是操作系统分配处理器时间的基本单元,在进程中可以有多个线程同时执行代码。进程之间是相对独立的,一个进程无法访问另一个进程的数据(除非利用分布式计算方式),一个进程运行的失败也不会影响其他进程的运行,Wi...转载 2020-03-01 18:35:02 · 265 阅读 · 0 评论 -
java动态加载jar文件
package com.manulife.test;import java.io.File;import java.lang.reflect.Method;import java.net.URL;import java.net.URLClassLoader;/** * Created by hp on 2019/11/20. */public class LoadJars {...转载 2019-11-21 00:20:40 · 311 阅读 · 0 评论 -
【深度干货】线程池从入门到放弃
转载 https://www.cnblogs.com/superfj/p/7544971.html前言多线程的异步执行方式,虽然能够最大限度发挥多核计算机的计算能力,但是如果不加控制,反而会对系统造成负担。线程本身也要占用内存空间,大量的线程会占用内存资源并且可能会导致Out of Memory。即便没有这样的情况,大量的线程回收也会给GC带来很大的压力。为了避免重复的创建线程,线程池的出现...转载 2019-08-13 15:48:05 · 112 阅读 · 0 评论 -
同步、异步与阻塞与非阻塞的区别
开场白:异步就是异步 网上有许多I/O模型的相关文章,主要涉及四个概念,同步,异步,阻塞,非阻塞。有些文章将这四个作了两两组合,于是就有了:异步阻塞和异步非阻塞,可以明确的说,这完全是牵强之理解,无论<Unix网络编程>一书中所列的I/O模式,还是POSIX标准,都没有提这两个概念。异步就是异步!只有同步才有阻塞和非阻塞之分。 同步与异步的区别: 同步...转载 2019-07-04 16:33:48 · 402 阅读 · 0 评论 -
java线程安全问题之静态变量、实例变量、局部变量
来自:http://blog.csdn.net/aaa1117a8w5s6d/article/details/8295527java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同《java并发编程实践》中所说:写道给线程安全下定义比较困难。存在很多种定义,如:“一个类在可以被多个线程安全调用时就是线程安全的”。此处不赘述了,首先给出静态变量...转载 2019-05-09 14:38:44 · 244 阅读 · 0 评论 -
Base64.encodeBase64String加密字符串出现\r\n,引起hive text格式的表出现串行换行解决方案
由于项目需要,我写了一个针对hiva数据库的加密函数。String output = Base64.encodeBase64String(content);这样加密出来的output在中间和最后会出现\r\n的换行字符,查找资料后发现:据RFC 822规定,每76个字符,还需要加上一个回车换行,这里简直就是个巨坑,这个密文我在存入hive text格式的table后会出现串行的情况,期初我...原创 2019-01-21 18:26:00 · 17074 阅读 · 0 评论 -
在java中常出现的异常和解决方法
java.lang.nullpointerexception 这个异常大家肯定都经常遇到,异常的解释是”程序遇上了空指针”,简单地说就是调用了未经初始化的对象或者是不存在的对象,这个错误经常出现在创建图片,调用数组这些操作中,比如图片未经初始化,或者图片创建时的路径错误等等。对数组操作中出现空指针,很多情况下是一些刚开始学习编程的朋友常犯的错误,即把数组的初始化和数组元素的初始化混淆起来了。数组的转载 2017-03-30 23:17:08 · 376 阅读 · 0 评论 -
BigDecimal加减乘除运算
BigDecimal加减乘除运算java.math.BigDecimal。BigDecimal一共有4个够造方法,让我先来看看其中的两种用法:第一种:BigDecimal(double val) Translates a double into a BigDecimal.第二种:BigDecimal(String val) Translates the String repre sentatio转载 2017-05-01 12:30:46 · 281 阅读 · 0 评论 -
有return的情况下try catch finally的执行顺序
有return的情况下try catch finally的执行顺序结论: 1、不管有木有出现异常,finally块中代码都会执行; 2、当try和catch中有return时,finally仍然会执行; 3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以转载 2017-05-12 09:20:41 · 176 阅读 · 0 评论 -
Logger日志级别说明及设置方法、说明(转载)
日志记录器(Logger)是日志处理的核心组件。log4j具有5种正常级别(Level)。日志记录器(Logger)的可用级别Level (不包括自定义级别 Level), 以下内容就是摘自log4j API (http://jakarta.apache.org/log4j/docs/api/index.html):static Level WARNWARN level表明会出现潜在错误的转载 2018-01-05 09:42:00 · 17235 阅读 · 1 评论 -
java统计字符串中每个字符出现的次数
例如String str = “abcaaaefdabbhg”; 统计该字符串中每个字符出现的次数,输出: a====5 b====3 c====1 d====1 e====1 f====1 g====1 h====1方法一: 采用HashMappublic static void count(String str){ //将字符...转载 2018-03-14 21:28:38 · 26579 阅读 · 0 评论 -
记录java,foreach循环中更改了集合会出现java.util.ConcurrentModificationException
我们在是有foreach或者Iterator遍历list等集合的时候,如果对集合进行了更改,如删除或者增加的时候,这是会有ConcurrentModificationException抛出。List<String> list = new ArrayList<>(); list.add("123"); list.add("1233");...原创 2018-03-05 17:18:18 · 848 阅读 · 0 评论 -
对象锁,类锁区别
首先的明白Java中锁的机制synchronized 在修饰代码块的时候需要一个reference对象作为锁的对象. 在修饰方法的时候默认是当前对象作为锁的对象. 在修饰类时候默认是当前类的Class对象作为锁的对象.线程同步的方法:sychronized、lock、reentrantLock分析 方法锁(synchronized修饰方法时)通过在方法声明中加入 syn...转载 2018-03-22 12:31:02 · 201 阅读 · 0 评论 -
使用ReenTrantLock+Condition实现精准唤醒线程
以前我们wait/notify notifyAll来实现线程的等待唤醒机制,可是notify 并不能精准地帮我唤醒我们想要唤醒的那个进程,这是可以使用ReenTrantLock+Condition来实现精准唤醒一个线程,每一个线程都会有一个Condition对象对唤醒。 直接上代码:package com.richinfo.cn.reentrantlock;/** * @author ...原创 2018-05-18 14:36:50 · 1355 阅读 · 0 评论 -
java中对数字的精确运算使用类BigDecimal(转)
原文:https://www.cnblogs.com/lovelyYakir/p/6290299.htmlpublic class CalculateUtils { /** * 加法 * * @param var1 * @param var2 * @return */ public static double add(...转载 2018-07-12 10:02:27 · 552 阅读 · 0 评论 -
java多线程上机题,写一个简单的死锁程序
下面是一个非常简单的会出现死锁的程序:*/package com.richinfo.cn.thread;/** * @author : Allen(Wu Zhiwei) * @date 创建时间:2018年5月17日 下午8:58:20 * @version 1.0 * @parameter * @since * @return *//** * @auth...原创 2018-08-20 11:25:21 · 852 阅读 · 0 评论 -
java.net.BindException: Address already in use: JVM_Bind解决方案
在开发的时候我们开启了服务器(tomcat or jetty)。然后我们没有关闭服务器,而直接关闭了eclipse或者idea,这时当你再启动容器的时候就可能出现下面这个异常:java.net.BindException: Address already in use: JVM_Bind解决方法,首先查看端口被那个进程占用netstat -p tcp -ano | findstr :811...原创 2018-09-26 15:58:14 · 89475 阅读 · 10 评论 -
Java代码优化
转自:http://www.importnew.com/28395.html前言2016年3月修改,结合自己的工作和平时学习的体验重新谈一下为什么要进行代码优化。在修改之前,我的说法是这样的:就像鲸鱼吃虾米一样,也许吃一个两个虾米对于鲸鱼来说作用不大,但是吃的虾米多了,鲸鱼自然饱了。代码优化一样,也许一个两个的优化,对于提升代码的运行效率意义不大,但是只要处处都能注意代码优化,总体来说对于...转载 2018-10-30 14:36:15 · 125 阅读 · 0 评论 -
Java虚拟机的内存组成以及堆内存介绍
本文转载大神的文章:https://www.hollischuang.com/archives/80一、java内存组成介绍:堆(Heap)和非堆(Non-heap)内存按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heapmemory)”。可以看出...转载 2018-11-22 16:27:27 · 250 阅读 · 0 评论 -
java发送带图片的邮件代码
图片目录:实现代码:/** * 发送带附件的mail * * @param subject 邮件标题 * @param to 收件人列表 * @param cc 抄送人列表 * @param bodyText 邮件内容 * @param at...原创 2018-12-20 16:20:53 · 3523 阅读 · 0 评论 -
Java 技术之垃圾回收机制详解
转载大神文章:http://www.importnew.com/26821.html转载 2018-12-27 18:12:22 · 156 阅读 · 0 评论 -
New一个类的的时候 会执行什么
New一个类的的时候 执行顺序New一个类的的时候,1. 执行父类的static成员和static代码块(按照先后顺序)2. 执行子类的static成员和static代码块(按照先后顺序)3. 执行父类的非static成员字段变量和代码块的初始化(按照先后顺序)4. 执行父类的构造方法5. 执行子类的非static成员字段变量和代码块的初始化(按照先后顺序)6. 执行子类的构造方法作者:转载 2017-03-29 17:37:14 · 4087 阅读 · 0 评论