【JAVA多线程02】JAVA线程池

本文详细介绍了线程池的概念及其在Java中的应用。通过比喻解释了线程池的作用,阐述了线程池如何提高系统效率并避免资源浪费。同时,文章列举了Java中四种主要的线程池类型,并提供了创建和使用线程池的具体代码示例。

什么是线程池?

顾名思义线程池就是线程的容器

举个例子:在没有共享电源的年代,车站有5个人手机都没电且都没有带电源,这五个人想要给手机充电只能去车站的售货亭各花100块钱买一个移动电源;但是现在共享电源出现了,假设车站现在一共有3个共享移动电源,那么其中三个人只需要花一块钱租共享移动电源充电,后面2个人等前面的人用完了,接着花1块钱租就可以了(这个例子的前提是这5个人都不赶时间的前提下)

这里的共享电源出租点就相当于线程池。

 

线程池可以用来干什么?

线程池就是用来管理线程的

在没有接触线程池之前,我们使用线程的时候就去创建一个线程,然后startup()就可以

假设,你现在有一个while n(n=10000)的循环,每一次循环都要启动一个线程去计算n的因数,这样频繁而且大量的创建线程,系统的效率会大幅下降,系统会很快奔溃。

线程池就可以帮助我们解决这个问题,他使线程可以重复使用,就是执行完一个任务线程不会被销毁,而是可以继续执行其他任务

 

java中的线程池如何使用?

// 创建一个容量为5的线程池

ExecutorService executorService = Executors.newFixedThreadPool(5); 

// 向线程池提交一个任务(其实就是通过线程池来启动一个线程)

executorService.execute(new TestRunnable());

 

java中线程池的使用

 

java中有哪些线程池?

Java通过Executors提供四种线程池,分别为:

(1)newCachedThreadPool——创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

(2)newFixedThreadPool——创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

(3)newScheduledThreadPool——创建一个定长线程池,支持定时及周期性任务执行。

ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3); scheduledThreadPool.schedule(
newRunnable() {
    @Override
    public void run () {
        System.out.println("延迟三秒");
    }
},3,TimeUnit.SECONDS);

scheduledThreadPool.scheduleAtFixedRate(
newRunnable() {
    @Override
    public void run () {
        System.out.println("延迟 1 秒后每三秒执行一次");
    }
},1,3,TimeUnit.SECONDS);

(4)newSingleThreadExecutor——创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

 

java线程池参数说明?

小程序使用这些上述快捷方法创建线程没什么问题,对于服务端需要长期运行的程序,创建线程池应该直接使用ThreadPoolExecutor的构造方法。没错,上述Executors方法创建的线程池就是ThreadPoolExecutor

ThreadPoolExecutor构造方法

Executors中创建线程池的快捷方法,实际上是调用了ThreadPoolExecutor的构造方法(定时任务使用的是ScheduledThreadPoolExecutor),该类构造方法参数列表如下:

1

2

3

4

5

6

7

8

9

// Java线程池的完整构造函数

public ThreadPoolExecutor(

  int corePoolSize, // 线程池长期维持的线程数,即使线程处于Idle状态,也不会回收。

  int maximumPoolSize, // 线程数的上限

  long keepAliveTime, TimeUnit unit, // 超过corePoolSize的线程的idle时长,

                                     // 超过这个时间,多余的线程会被回收。

  BlockingQueue<Runnable> workQueue, // 任务的排队队列

  ThreadFactory threadFactory, // 新线程的产生方式

  RejectedExecutionHandler handler) // 拒绝策略

竟然有7个参数,很无奈,构造一个线程池确实需要这么多参数。这些参数中,比较容易引起问题的有corePoolSizemaximumPoolSizeworkQueue以及handler

  • corePoolSizemaximumPoolSize设置不当会影响效率,甚至耗尽线程;
  • workQueue设置不当容易导致OOM;
  • handler设置不当会导致提交任务时抛出异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值