java_线程池

血一样的教训,今天上午参加了一家现场面试java。在这之前,我一直认为我的java基础还是可以的,而今天一问三不知。现在将面试的问题整理出来

一、说说java中的线程池?

  1.线程池:线程池是线程的集合,不用自己创建线程,把线程直接给线程池,由线程池处理。

      2.过程:首先,使用线程池可以重复利用已有的线程继续执行任务,避免线程在创建和销毁时造成的消耗。

               其次,由于没有线程创建和销毁时的消耗,可以提高系统响应速度。

     最后,通过线程可以对线程进行合理的管理,根据系统的承受能力调整可运行线程数量的大小等。

      3.用线程池的例子:

1package com.company; 2 3import java.util.concurrent.ExecutorService; 4import java.util.concurrent.Executors; 5 6/*线程池*/ 7public class ThreadPool implements Runnable{ 8 @Override 9 public void run() { 10 System.out.println(Thread.currentThread().getName()); 11 } 12 public static void main(String[] args) { 13 ExecutorService executorService = Executors.newFixedThreadPool(2); 14 Runnable runnable1 = new ThreadPool(); 15 Runnable runnable2 = new ThreadPool(); 16 Runnable runnable3 = new ThreadPool(); 17 Runnable runnable4 = new ThreadPool(); 18 Runnable runnable5 = new ThreadPool(); 19 executorService.execute(runnable1); 20 executorService.execute(runnable2); 21 executorService.execute(runnable3); 22 executorService.execute(runnable4); 23 executorService.execute(runnable5); 24 25 } 26}

 运行结果:从中可以看出来,线程池能够限制跑几个线程。案例中只能跑起来线程1和线程2

 

   4.线程池中状态的转换:

   线程池有五种状态RUNNING,SHUTDOWN,STOP,TIDYING,TERMINATED。线程池的状态可操作的其实只有两种状态   

    RUNNING: 运行状态。线程一旦被创建就会处于此状态,此状态时正常的运行状态,能够接收新的任务并处理任务。

    SHUTDOWN:关闭状态。SHUTDOWN,TOP,TIDYING三个状态都是中间状态。RUNNING调用shutdown()方法进入SHUTDOWN关闭状态。不能接受新的任务,将正在执行的任务处理完毕后进入到TIDYING整理状态,

    STOP:停止状态。RUNNING调用shutdownNow()进入STOP关闭状态。不接受任务,也不处理任务,直接中断任务,然后进入到TIDYING整理状态,

    TIDYING:整理状态。会自动调用terminate方法,调用完后进入到终止状态。

    5.线程池方法中的参数(对线程池中进行约束)

1public ThreadPoolExecutor(int corePoolSize, 2 int maximumPoolSize, 3 long keepAliveTime, 4 TimeUnit unit, 5 BlockingQueue<Runnable> workQueue, 6 ThreadFactory threadFactory, 7 RejectedExecutionHandler handler) { 8 if (corePoolSize < 0 || 9 maximumPoolSize <= 0 || 10 maximumPoolSize < corePoolSize || 11 keepAliveTime < 0) 12 throw new IllegalArgumentException(); 13 if (workQueue == null || threadFactory == null || handler == null) 14 throw new NullPointerException(); 15 this.corePoolSize = corePoolSize; 16 this.maximumPoolSize = maximumPoolSize; 17 this.workQueue = workQueue; 18 this.keepAliveTime = unit.toNanos(keepAliveTime); 19 this.threadFactory = threadFactory; 20 this.handler = handler; 21 }

corePoolSize:核心池大小,表示线程池正常情况下能运行的线程最大多少。
maximumPoolSize:最大池大小,表示线程池最大能运行的线程数。
keepAliveTime:表示线程执行任务后的空闲存活时间,过了这个时间线程将被销毁,这个参数的存在也直接实现了概述中所说的前两点优点,线程的消耗可以分为A,B,C三个阶段,A代表创建,B代表执行,C代表消耗,如果有很多个任务需要执行时,B执行所带来的消耗代价小于A,C所带来的消耗代价,那么就通过这个参数,让线程保持一段存活时间,方便执行后面的任务。
unit:线程空闲存活时间的单位。
workQueue:这个是任务队列,将后面的任务加入到这个队列中。
threadFactory:真正用于创建线程的参数。
handler:表示已经不能在接收任务时,调用的处理类。

参考链接:https://blog.csdn.net/liuyuanq123/article/details/80282221

点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java 面试知识点笔记(十三)多线程与并发

java线程池,利用Exceutors创建不同的线程池满足不同场景需求:1.newSingleThreadExecutor() 创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。2.

java各种面试问题

二、Java多线程相关线程池的原理,为什么要创建线程池?创建线程池的方式;线程的生命周期,什么时候会出现僵死进程;说说线程安全问题,什么实现线程安全,如何实现线程安全;创建线程池有哪几个核心参数?如何合理配置线程池的大小?volatile、ThreadLocal的使用场景和原理;

多线程面试

多线程篇1.为什么要使用线程池tex避免频繁地创建和销毁线程,达到线程对象的重用。另外,使用线程池还可以根据项目灵活地控制并发的数目。2.java中如何获取到线程dump文件tex死循环、死锁、阻

JAVA多线程学习

Java通过Excutors提供四种线程池:newCachedThreadPool        创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。newFixedThreadPool        创建一个定长线程,可控制线程最大并发数

Java多线程之线程池7大参数、底层工作原理、拒绝策略详解

Java多线程之线程池7大参数详解目录企业面试题线程池7大参数源码线程池7大参数详解底层工作原理详解线程池的4种拒绝策略理论简介面试的坑:线程池实际中使用哪一个?1\.企业面试题线程池的工作原理,几个重要参数,然后给了具体几个参数分析线程池会怎么做,最后问阻塞队列用是什么?线程池的构造类的方