java线程池

文中会介绍多线程池中类的用法,最后会有一个代码编程实现了,使用普通方法与构造线程池方式来完成一个任务的性能对比。新建同数量的线程,添加相同的数据量,并销毁同数量的线程。

1.概述

从别人博客看到一张图,图就是讲ThreadPoolExecutor类怎么运行流程,图过程与源码注释一样

!在这里插入图片描述

下图是从java的类关系图中截取下来的(使用idea的diagram查看)

在这里插入图片描述

​ 上图是线程池自顶向下的接口与类的继承与实现关系

接下来我们就从下到上讲一讲这些类或接口的定义,功能与方法。

2.讲一下java.util.concurrent.*的接口类,与实现类
1.ThreadPoolExecutor

ThreadPoolExecutor是Java线程池框架中最重要的类之一了,许多接口与虚类都依靠它来实例化,所以推荐去看源码。ThreadPoolExecutor的是一个实现构建线程池和众多方法的类,因为是实现类,所以可以满足各种线程池的需求。如果我们对线程池的要求不高,我们就可以使用Executors快速的创建线程池。

ThreadPoolExecutor构造方法如下:(参数比较多,构造起来比较麻烦)

在这里插入图片描述

ThreadPoolExecutor实现接口的所有方法,方法的功能会在以下的接口类中讲到,所以就不展示了,可以自己去看源码。

2.AbstractExecutorService

AbstractExecutorService虚类的方法如下:

在这里插入图片描述

?,因为newTask(*)方法在我的例子中也用不到,我也不讲了,自己看吧。

3.ExecutorService

ExecutorService的功能能对线程池线程进行管理,添加新任务,获取线程池信息,关闭线程池任务。

我们是使用java.util.concurrent.Executors 快速建立线程池并返回实例给ExecutorService。

接下来看一下ExecutorService的方法及其功能吧:

在这里插入图片描述

2.java.util.concurrent.Executors

Executors是一个能够帮助开发者快速建立线程池的工具类,有许多的构造线程池的方法,返回值为ExecutorService与ScheduledExecutorService。

ScheduledExecutorService

其中ScheduledExecutorService是继承ExecutorService的接口,扩展时间周期性执行的方法。

Executors建立线程池的实现方式

在这里插入图片描述

如上图所示,Executor能十分快的建立线程池并返回ExecutorService进行线程管理,但实际上Executors的建造线程池实际上就是调用ThreadPoolExecutor类的构造函数,因为Excutors封装了ThreadPoolExecutor方法,让开发者不需要输入许多参数就能创建线程池。

1.使用newFixedThreadPool(int i) 定义一个固定数量的线程池 ,

在这里插入图片描述

2.使用newCachedThreadPool()定义一个没有上线的线程池,核心线程数为零,最大线程数没有界限只要资源足够。

3.编程,普通线程与线程池的方法实现性能对比

通过改变main函数中的注释来调整创建线程的方式。

package club.yzren.executor_;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;

public class MainTest {
    public static final int maxnum=1000;
    public  static int  page=0;
    private  static boolean condition=true;
        public static void  main(String args[]){
            //使用普通的创建线程的方法,往List中添加数据到maxnum
           // threadNormal();

            //使用线程池数往List中添加数据到maxnum
         threadPool();

        }
        
        //普通的创建线程的方法
 public static void threadNormal() {
            long timeTemp = System.currentTimeMillis();
            List array = new ArrayList();
            for (int i = 0; i < maxnum; i++) {
                final int j = i;
                Thread thread = new Thread(new Runnable() {
                    @Override
                    public void run() {
                        array.add(j);
                    }
                });
                thread.start();//普通线程启动
                try {
                    thread.join();//等待普通线程关闭,后才能执行主线程
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("threadNormal using:" + (System.currentTimeMillis() -timeTemp));

        }
        
        
        //使用线程池的方法
 public static void threadPool(){
            long timeTemp=System.currentTimeMillis();

            //使用Executors.newFixedThreadPool()的方法来构造线程池
            ExecutorService executorService=  Executors.newFixedThreadPool(1);
            List list=new ArrayList();
        for (int i=0;i<maxnum;i++){
            final int j=i;
           executorService.execute(new Runnable() {
               @Override
               public void run() {
                    list.add(j);
               }
           });
        }
                executorService.shutdown();//进行关闭线程池线程
            try {
                executorService.awaitTermination(1,TimeUnit.DAYS);//等待线程全部关闭
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("ThreadPool using:"+(System.currentTimeMillis()-timeTemp));

        }
}

性能对比结果图:

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java线程池是一种用于管理和复用线程的机制,它可以提高多线程应用程序的性能和效率。线程池中的线程可以被重复使用,避免了频繁创建和销毁线程的开销。 在Java中,线程池可以通过`ExecutorService`接口来创建和管理。线程池中的线程可以执行提交给它的任务,并且可以根据需要自动创建新的线程或销毁闲置的线程。 嵌套线程池是指在一个线程池中创建另一个线程池。这种情况通常发生在需要处理一些复杂的任务,其中每个任务本身也需要使用线程池来执行。 下面是一个示例代码,演示了如何在Java中嵌套使用线程池: ```java import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class NestedThreadPoolExample { public static void main(String[] args) { // 创建外层线程池 ExecutorService outerThreadPool = Executors.newFixedThreadPool(5); // 提交任务给外层线程池 outerThreadPool.execute(() -> { // 创建内层线程池 ExecutorService innerThreadPool = Executors.newFixedThreadPool(3); // 提交任务给内层线程池 innerThreadPool.execute(() -> { // 内层线程池执行的任务 System.out.println("Inner thread pool task executed"); }); // 关闭内层线程池 innerThreadPool.shutdown(); }); // 关闭外层线程池 outerThreadPool.shutdown(); } } ``` 在上面的示例中,我们首先创建了一个外层线程池`outerThreadPool`,它使用`Executors.newFixedThreadPool()`方法创建了一个固定大小的线程池。然后,我们向外层线程池提交了一个任务,该任务在执行时创建了一个内层线程池`innerThreadPool`,并向内层线程池提交了一个任务。最后,我们分别关闭了内层线程池和外层线程池

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值