Java线程池的简单使⽤⽅法实例教程
⽬录
线程池使⽤场景?
Java线程池使⽤
总结
线程池使⽤场景?
java中经常需要⽤到多线程来处理⼀些业务,我们⾮常不建议单纯使⽤继承Thread或者实现Runnable接⼝的⽅式来创建线程,那样势必有创建及销毁线程耗费资源、线程上下⽂切换问题。同时创建过多的线程也可能引发资源耗尽的风险,这个时候引⼊线程池⽐较合理,⽅便线程任务的管理。java中涉及到线程池的相关类均在jdk1.5开始的urrent包中,涉及到的⼏个核⼼类及接⼝包括:Executor、Executors、ExecutorService、ThreadPoolExecutor、FutureTask、Callable、Runnable等。
Java线程池使⽤
对于资源池的技术,相信⼤家早就接触过,⽐如数据库连接池,常见的有c3p0、dbcp等等,⽽线程也有对应的池⼦,称为线程池。
Java提供了Executors类来创建⼀个线程池,如:
public static void main(String[] args) {
ExecutorService executorService = wFixedThreadPool(10);
Thread thread = new Thread(() -> {
System.out.println("hello world!");
});
}
通过newFixedThreadPool()⽅法可以获得⼀个指定线程数的线程池。
⼜如:
public static void main(String[] args) {
ExecutorService executorService = wSingleThreadExecutor();
Thread thread = new Thread(() -> {
System.out.println("hello world!");
});
}
通过newSingleThreadExecutor()⽅法可以获得⼀个线程数为1的线程池。
还有:
public static void main(String[] args) {
ExecutorService executorService = wCachedThreadPool();
Thread thread = new Thread(() -> {
System.out.println("hello world!");java线程池创建的四种
});
}
通过newCachedThreadPool()⽅法可以获得⼀个根据需要创建线程的线程池,它会根据任务数创建对应数量的线程。
我们发现,通过Executors类能够创建各式各样的线程池,但阿⾥巴巴Java开发⼿册并不推荐我们使⽤Executors类的⽅式创建线程,⽽是要⾃⼰⼿动创建:
那如何⼿动创建线程池呢?
public static void main(String[] args) {
ThreadPoolExecutor executor = new ThreadPoolExecutor(
5,
10,
5L,
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(3),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.CallerRunsPolicy());
System.out.println("hello world");
});
}
构造ThreadPoolExecutor对象即可得到⼀个线程池,但需要指定七个参数,分别如下:
1. corePoolSize:核⼼线程数
2. maximumPoolSize:最⼤线程数
3. keepAliveTime:空闲时间
4. unit:空闲时间单位
5. workQueue:任务队列
6. threadFactory:创建线程的⼯⼚
7. handler:饱和策略
其中核⼼线程数表⽰线程池中最核⼼的线程,它们在任何情况下都不会被回收,⽽是等待任务的到来,最⼤线程数是线程池能够创建的最⼤线程数,空闲时间表⽰某个⾮核⼼线程在等待空闲时间后仍然没有任务执⾏,该线程便会被回收,创建线程的⼯⼚⽤于指定创建线程的⽅式,⼀般默认即可,饱和策略表⽰当线程池达到最⼤线程数后,超出的任务应该如何进⾏处理。
举⼀个简单的例⼦,现在有10个任务等待执⾏,因为我们的核⼼线程数为5,所以线程池会先创建5个线程⽤于执⾏其中的5个任务,剩下的5个任务会被放⼊任务队列,⽽任务队列的容量只有3,所以任务队列只能够放下3个任务,剩下的2个任务⽆法放⼊队列,线程池就会创建2个⾮核⼼线程⽤于执⾏它们,若是此时线程池中的线程数达到了最⼤线程数,则会触发饱和策略,⽐如这⾥的CallerRunsPolicy策略,它将直接丢弃掉新的任务。
总结
到此这篇关于Java线程池的简单使⽤的⽂章就介绍到这了,更多相关Java线程池使⽤内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论