首页>>后端>>java->Java线程池的简单使用

Java线程池的简单使用

时间:2023-11-30 本站 点击:0

对于资源池的技术,相信大家早就接触过,比如数据库连接池,常见的有c3p0、dbcp等等,而线程也有对应的池子,称为线程池。

Java提供了Executors类来创建一个线程池,如:

publicstaticvoidmain(String[]args){ExecutorServiceexecutorService=Executors.newFixedThreadPool(10);Threadthread=newThread(()->{System.out.println("helloworld!");});executorService.execute(thread);}

通过newFixedThreadPool()方法可以获得一个指定线程数的线程池。

又如:

publicstaticvoidmain(String[]args){ExecutorServiceexecutorService=Executors.newSingleThreadExecutor();Threadthread=newThread(()->{System.out.println("helloworld!");});executorService.execute(thread);}

通过newSingleThreadExecutor()方法可以获得一个线程数为1的线程池。

还有:

publicstaticvoidmain(String[]args){ExecutorServiceexecutorService=Executors.newCachedThreadPool();Threadthread=newThread(()->{System.out.println("helloworld!");});executorService.execute(thread);}

通过newCachedThreadPool()方法可以获得一个根据需要创建线程的线程池,它会根据任务数创建对应数量的线程。

我们发现,通过Executors类能够创建各式各样的线程池,但阿里巴巴Java开发手册并不推荐我们使用Executors类的方式创建线程,而是要自己手动创建:

那如何手动创建线程池呢?

publicstaticvoidmain(String[]args){ThreadPoolExecutorexecutor=newThreadPoolExecutor(5,10,5L,TimeUnit.SECONDS,newArrayBlockingQueue<>(3),Executors.defaultThreadFactory(),newThreadPoolExecutor.CallerRunsPolicy());executor.execute(()->{System.out.println("helloworld");});}

构造ThreadPoolExecutor对象即可得到一个线程池,但需要指定七个参数,分别如下:

corePoolSize:核心线程数

maximumPoolSize:最大线程数

keepAliveTime:空闲时间

unit:空闲时间单位

workQueue:任务队列

threadFactory:创建线程的工厂

handler:饱和策略

其中核心线程数表示线程池中最核心的线程,它们在任何情况下都不会被回收,而是等待任务的到来,最大线程数是线程池能够创建的最大线程数,空闲时间表示某个非核心线程在等待空闲时间后仍然没有任务执行,该线程便会被回收,创建线程的工厂用于指定创建线程的方式,一般默认即可,饱和策略表示当线程池达到最大线程数后,超出的任务应该如何进行处理。

举一个简单的例子,现在有10个任务等待执行,因为我们的核心线程数为5,所以线程池会先创建5个线程用于执行其中的5个任务,剩下的5个任务会被放入任务队列,而任务队列的容量只有3,所以任务队列只能够放下3个任务,剩下的2个任务无法放入队列,线程池就会创建2个非核心线程用于执行它们,若是此时线程池中的线程数达到了最大线程数,则会触发饱和策略,比如这里的CallerRunsPolicy策略,它将直接丢弃掉新的任务。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/java/4967.html