java面试题之个人对线程池的理解

简介: java面试题之个人对线程池的理解

多线程的的创建方式?

1.使用一个类继承Thread类,并重写run()方法,然后实例化该类,执行start()方法,start()启动线程并执行自己的run()方法,我自己写的一个小例子:

2.使用一个类实现Runnable接口,重写run()方法,使用的时候实例化一个Thread对象,将该类作为参数传入Thread中,并调用start()方法即可启动一个线程,线程会执行run()方法中的内容。来看我自己写的一个小例子:

什么是线程池?如何使用

线程池就是事先将线程放到一个容器中,当使用线程的时候,不用再去new出一个线程,直接从线程池取出来就可以了

使用:

 

Java提供了多种创建线程池的方式:

ExecutorService executors = Executors.newFixexThreadPool(3);创建固定大小的线程池,例子中只能放下3个线程

 

ExecutorService executors = Executors.newCachedThreadPool();创建可缓存的线程池,根据需要创建线程池,上限为操作系统的内存条大小

 

ExecutorService executors = Executors.newSingleThreadExecutor();创建单个线程的线程池

 

ScheduleExecutorService executors = Executors.newScheduledThreadPool();创建调度线程池,没有大小限制,若使用不当,可能会出现内存溢出,程序中断等情况。

上述中线程池创建方式创建线程之后,通过execute()方法启动线程池

来看看测试运行效果:

 

请叙述一下您对线程池的理解?

回答这个面试题要从线程池的好处线程池如何使用线程池启动时执行的策略来说

线程池的好处:

  1. 降低资源消耗:重复利用线程池中的线程节省线程创建和销毁带来的消耗;
  2. 提高性能:当任务需求时,可以不用创建线程直接执行,主要是直接从线程池中取出线程去执行;
  3. 提高线程的可管理性:线程是稀缺资源,而且也是任务中不可少的资源,如果频繁的且无限制的创建会消耗系统资源,降低系统稳定性导致系统崩溃,内存溢出等等问题

如何使用线程池:

上述中线程池创建方式创建线程之后,通过execute()方法启动线程池

线程池启动时执行的策略:

首先看看官方对线程池的执行描述:

/*

27. * Proceed in 3 steps:

28. *

29. * 1. If fewer than corePoolSize threads are running, try to

30. * start a new thread with the given command as its first

31. * task. The call to addWorker atomically checks runState and

32. * workerCount, and so prevents false alarms that would add

33. * threads when it shouldn't, by returning false.

34. *

35. * 2. If a task can be successfully queued, then we still need

36. * to double-check whether we should have added a thread

37. * (because existing ones died since last checking) or that

38. * the pool shut down since entry into this method. So we

39. * recheck state and if necessary roll back the enqueuing if

40. * stopped, or start a new thread if there are none.

41. *

42. * 3. If we cannot queue task, then we try to add a new

43. * thread. If it fails, we know we are shut down or saturated

44. * and so reject the task.

45. */

翻译过来的意思太难理解了,歪果仁的思想搞不懂,于是乎看了看其他博主的帖子,做了一些汇总:

刚开始创建线程池的时候是没有池容器中是没有线程的。

执行execute()方法前提是线程池中要有线程,不然编译不通过,

在线程池执行execute()方法后,

先解释corePoolSize:线程池的核心大小

maximumPoolSize:线程池最大线程数(每个线程池都不一样)

1.首先会判断当前的线程池的corePoolSize大小,是否存满了这个大小的线程数,如果够了就放入等待队列中,

2.如果等待队列也满了并且当前正在运行的线程数量小于 maximumPoolSize,那么依然会执行这个线程,

3.如果大于了maximumPoolSize,则会抛出异常。

继续说上边的,如果没有存满,则会直接执行线程。

4.当一个线程执行完,会马上从任务队列取出一个任务去执行。

5.如果一个线程很长时间没有执行任务,这个 很长时间就是keepAliveTime,超出了这个时间且当前运行的线程大于corePoolSize,这个线程就会被销毁,所以说,所有任务执行完之后,等待一会,线程池就会变回corePoolSize的大小。

相关文章
|
1月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
143 1
|
1月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
160 1
|
2月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
136 0
|
2月前
|
算法 Java
50道java集合面试题
50道 java 集合面试题
|
2月前
|
算法 Java
50道java基础面试题
50道java基础面试题
|
2月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
220 16
|
3月前
|
缓存 并行计算 安全
关于Java多线程详解
本文深入讲解Java多线程编程,涵盖基础概念、线程创建与管理、同步机制、并发工具类、线程池、线程安全集合、实战案例及常见问题解决方案,助你掌握高性能并发编程技巧,应对多线程开发中的挑战。
|
3月前
|
数据采集 存储 前端开发
Java爬虫性能优化:多线程抓取JSP动态数据实践
Java爬虫性能优化:多线程抓取JSP动态数据实践

热门文章

最新文章

下一篇
oss云网关配置