各位老铁们,大家好,今天由我来为大家分享Java线程池,以及不建议用cachedthreadpool的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!
本文目录
Java线程池
多线程是为了能够让计算机资源合理的分配,对于处理不同的任务创建不同的线程进行处理,但是计算机创建一个线程或者销毁一个线程所花费的也是比较昂贵的,有时候需要同时处理的事情比较多,就需要我们频繁的进行线程的创建和销毁,这样花费的时间也是比较多的。为了解决这一问题,我们就可以引用线程池的概念。
所谓线程池就是将线程集中管理起来,当需要线程的时候,可以从线程池中获取空闲的线程,这样可以减少线程的频繁创建与销毁,节省很大的时间和减少很多不必要的操作。
在java中提供了ThreadPoolExecutor类来进行线程的管理,这个类继承于AbstractExecutorService,而AbstractExecutorService实现了ExecutorService接口,我们可以使用ThreadPoolExecutor来进行线程池的创建。
在ThreadPoolExecutor的构造方法中,有多个参数,可以配置不同的参数来进行优化。这个类的源码构造方法为:
publicThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,longkeepAliveTime,TimeUnitunit,BlockingQueueworkQueue,ThreadFactorythreadFactory,RejectedExecutionHandlerhandler)其中每个参数代表的意义分别为:
corePoolSize:线程池中的核心线程数量,当线程池中当前的线程数小于这个配置的时候,如果有一个新的任务到来,即使线程池中还存在空闲状态的线程,程序也会继续创建一个新的线程放进线程池当中
maximumPoolSize:线程池中的线程最大数量
keepAliveTime:当线程池中的线程数量大于配置的核心线程数量(corePoolSize)的时候,如果当前有空闲的线程,则当这个空闲线程可以存在的时间,如果在keepAliveTime这个时间点内没有新的任务使用这个线程,那么这个线程将会结束,核心线程不会结束,但是如果配置了allowCoreThreadTimeOut=true,则当空闲时间超过keepAliveTime之后,线程也会被结束调,默认allowCoreThreadTimeOut=false,即表示默认情况下,核心线程会一直存在于线程池当中。
unit:空闲线程保持连接时间(keepAliveTime)的时间单位
workQueue:阻塞的任务队列,用来保存等待需要执行的任务。
threadFactory:线程工厂,可以根据自己的需求去创建线程的对象,设置线程的名称,优先级等属性信息。
handler:当线程池中存在的线程数超过设置的最大值之后,新的任务就会被拒绝,可以自己定义一个拒绝的策略,当新任务被拒绝之后,就会使用hander方法进行处理。
在java中也提供了Executors工具类,在这个工具类中提供了多个创建线程池的静态方法,其中包含newCachedThreadPool、newFixedThreadPool、newScheduledThreadPool、newSingleThreadExecutor等。但是他们每个方法都是创建了ThreadPoolExecutor对象,不同的是,每个对象的初始参数值不一样;
编写Java代码如何更加规范和简洁
一、MyBatis不要为了多个查询条件而写1=1
当遇到多个查询条件,使用where1=1可以很方便的解决我们的问题,但是这样很可能会造成非常大的性能损失,因为添加了“where1=1”的过滤条件之后,数据库系统就无法使用索引等查询优化策略,数据库系统将会被迫对每行数据进行扫描(即全表扫描)以比较此行是否满足过滤条件,当表中的数据量较大时查询速度会非常慢;此外,还会存在SQL注入的风险。
反例:
<selectparameterType="com.tjt.platform.entity.BookInfo"resultType="java.lang.Integer">
selectcount(*)fromt_rule_BookInfotwhere1=1
<iftest="title!=nullandtitle!=''">
ANDtitle=#{title}
</if>
<iftest="author!=nullandauthor!=''">
ANDauthor=#{author}
</if>
</select>复制代码
正例:
<selectparameterType="com.tjt.platform.entity.BookInfo"resultType="java.lang.Integer">
selectcount(*)fromt_rule_BookInfot
<where>
<iftest="title!=nullandtitle!=''">
title=#{title}
</if>
<iftest="author!=nullandauthor!=''">
ANDauthor=#{author}
</if>
</where>
</select>复制代码UPDATE操作也一样,可以用<set>标记代替1=1。
二、迭代entrySet()获取Map的key和value
当循环中只需要获取Map的主键key时,迭代keySet()是正确的;但是,当需要主键key和取值value时,迭代entrySet()才是更高效的做法,其比先迭代keySet()后再去通过get取值性能更佳。
反例:
//Map获取value反例:
HashMap<String,String>map=newHashMap<>();
for(Stringkey:map.keySet()){
Stringvalue=map.get(key);
}复制代码
正例:
//Map获取key&value正例:
HashMap<String,String>map=newHashMap<>();
for(Map.Entry<String,String>entry:map.entrySet()){
Stringkey=entry.getKey();
Stringvalue=entry.getValue();
}复制代码正是金九银十跳槽季,为大家收集了2019年最新的面试资料,有文档、有攻略、有视频。有需要的同学可以在公众号【Java知己】,发送【面试】领取最新面试资料攻略!暗号【1024】千万不要发,否则.....
三、使用Collection.isEmpty()检测空
使用Collection.size()来检测是否为空在逻辑上没有问题,但是使用Collection.isEmpty()使得代码更易读,并且可以获得更好的性能;除此之外,任何Collection.isEmpty()实现的时间复杂度都是O(1),不需要多次循环遍历,但是某些通过Collection.size()方法实现的时间复杂度可能是O(n)。O(1)纬度减少循环次数例子
反例:
LinkedList<Object>collection=newLinkedList<>();
if(collection.size()==0){
System.out.println("collectionisempty.");
}复制代码
正例:
LinkedList<Object>collection=newLinkedList<>();
if(collection.isEmpty()){
System.out.println("collectionisempty.");
}
//检测是否为null可以使用CollectionUtils.isEmpty()
if(CollectionUtils.isEmpty(collection)){
System.out.printl
如何学习Java多线程
JAVA中的多线程使用十分广泛,很多的JAVA框架都使用到了多线程,比如spring,mybatis,druid等!
多线程有什么好处呢?比如说web服务器的多连接,异步调用,并行操作,避免持续阻塞等等!
多线程怎么实现呢?1,继承Thread类,2,实现Runnable接口,3实现callable+futureTask实现异步回调,4,使用线程池Executors.newFixedThreadPool(5);
多线程怎么保证线程安全?
1,时间换空间:加锁
①,synchronize:锁方法,锁代码段,锁对象,锁的粒度大!
②,reentrantlock:使用lock和unlock实现加锁和解锁,可使用ReadWriteLock读写锁来实现读和写的锁分离,底层使用CAS和AQS实现,这也是很多框架里面用到的技术!
2,空间换时间:线程的本地变量隔离,ThreadLocal,实现一个线程一份变量,数据不共享,所以线程安全,spring中bean默认都是单例的,但是spring接受并发请求是线程安全的,就是因为使用threadlocal把请求,上下文数据装在了线程里。所以请求之间互不干涉!
JAVA多线程还涉及到哪些技术?
1,synchonizeHashmap,hashTable(基本上是锁方法,所以效率低),concurrentHashmap(分段锁,锁粒度小,性能好),CopyOnWriteArrayList、CopyOnWriteArraySet(可重入锁)等等!
2,countdownbatch用做计数器!
3,使用forkjoin做并行计算!
4,有锁不如无锁!
....
多了解这些技术下面底层的东西,多去实际情景中总结,犯错然后改正才能更快的成长!
JAVA多线程知识点可以写好几本书,而随便一个知识点都可以写一章,只有经常钻研并使用才能懂其精髓,希望我在这条路上越走越远,以后学到的东西就记录于此,互相学习,共勉。。
好了,文章到此结束,希望可以帮助到大家。