java线程池应用相关技术点总结

1. JSONArray、JSONObject是非线程安全的,这是因为它们的底层分别默认是Arraylist和HashMap,非线程安全;多线程中使用它们的put/add操作等需要同步;

2. JSONArray底层默认是Arraylist,Arraylist没有类似ConcurrentHashMap可替换HashMap的线程安全数据结构,一般直接用synchronized关键字同步,锁对象是JSONArray对象,将例如add操作包起来;

JSONObject底层默认是HashMap,所以将ConcurrentHashMap作为参数,构造JSONObject可以解决多线程问题;

3. 主线程与子线程通信(传值),需用集合类变量,且使用集合类的put等操作,不能直接赋值;以上结论指的是使用匿名类实现的线程,例如如下形式:lambda表达式、new Runnable接口;

原因这种情况,匿名类一般通过将结果赋值给主线程中的变量,实现通信,而事实上主线程中的变量是作为参数传递给匿名类,引用传递,从代码层面上看(语义上),该变量对于匿名类和主线程是唯一的,若内部类对其赋值,则内部类指向该变量的符号引用将指向另一个新对象,那么造成了语义上的错误,所以赋值的办法是不行的,编译也不会通过,只能通过集合类操作完成通信;

4. 线程池大小确定:最佳线程数目 = ((线程等待时间+线程CPU时间)/线程CPU时间 )* CPU数目;

即I/0密集的任务,应扩大线程池,因为每个线程等待时间较长,CPU利用率低;

CPU密集的任务,线程池小一些比较好,比如CPU个数+1;

5. 线程池工作队列大小确定:工作队列类似于一个缓存,若工作队列长度为0,那么线程池满了将直接拒绝请求(java.util.concurrent.RejectedExecutionException),否则将进入队列等待,若对响应时间要求不高可以这样做;

6. ConcurrentHashMap的性能比synchronized关键字好,前者使用CAS算法;

7. 对应用多线程的接口,使用jmeter测试,能验证高并发下功能正确性、发现性能瓶颈;

使用POST方法的HTTP请求时,在HTTP header manager项里注意Content-Type设置需要的类型,一般表单给application/x-www-form-urlencoded就可以;

在view result tree里能看见每个请求的request和response详情(header和body),请求有问题时便于排查;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值