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天前
|
SQL Java Unix
Android经典面试题之Java中获取时间戳的方式有哪些?有什么区别?
在Java中获取时间戳有多种方式,包括`System.currentTimeMillis()`(毫秒级,适用于日志和计时)、`System.nanoTime()`(纳秒级,高精度计时)、`Instant.now().toEpochMilli()`(毫秒级,ISO-8601标准)和`Instant.now().getEpochSecond()`(秒级)。`Timestamp.valueOf(LocalDateTime.now()).getTime()`适用于数据库操作。选择方法取决于精度、用途和时间起点的需求。
14 3
|
1天前
|
监控 Java
Java并发编程:深入理解线程池
在Java并发编程领域,线程池是提升应用性能和资源管理效率的关键工具。本文将深入探讨线程池的工作原理、核心参数配置以及使用场景,通过具体案例展示如何有效利用线程池优化多线程应用的性能。
|
4天前
|
安全 算法 Java
Java 中的并发控制:锁与线程安全
在 Java 的并发编程领域,理解并正确使用锁机制是实现线程安全的关键。本文深入探讨了 Java 中各种锁的概念、用途以及它们如何帮助开发者管理并发状态。从内置的同步关键字到显式的 Lock 接口,再到原子变量和并发集合,本文旨在为读者提供一个全面的锁和线程安全的知识框架。通过具体示例和最佳实践,我们展示了如何在多线程环境中保持数据的一致性和完整性,同时避免常见的并发问题,如死锁和竞态条件。无论你是 Java 并发编程的新手还是有经验的开发者,这篇文章都将帮助你更好地理解和应用 Java 的并发控制机制。
|
9天前
|
安全 Java 开发者
Java并发编程中的线程安全性与性能优化
在Java编程中,处理并发问题是至关重要的。本文探讨了Java中线程安全性的概念及其在性能优化中的重要性。通过深入分析多线程环境下的共享资源访问问题,结合常见的并发控制手段和性能优化技巧,帮助开发者更好地理解和应对Java程序中的并发挑战。 【7月更文挑战第14天】
|
9天前
|
监控 Java API
Java并发编程之线程池深度解析
【7月更文挑战第14天】在Java并发编程领域,线程池是提升性能、管理资源的关键工具。本文将深入探讨线程池的核心概念、内部工作原理以及如何有效使用线程池来处理并发任务,旨在为读者提供一套完整的线程池使用和优化策略。
|
11天前
|
NoSQL Java 应用服务中间件
Java高级面试题
Java高级面试题
|
2月前
|
安全 Java
深入理解Java并发编程:线程安全与性能优化
【2月更文挑战第22天】在Java并发编程中,线程安全和性能优化是两个重要的主题。本文将深入探讨这两个主题,包括线程安全的基本概念,如何实现线程安全,以及如何在保证线程安全的同时进行性能优化。
29 0
|
2月前
|
存储 安全 Java
深入理解Java并发编程:线程安全与锁机制
【5月更文挑战第31天】在Java并发编程中,线程安全和锁机制是两个核心概念。本文将深入探讨这两个概念,包括它们的定义、实现方式以及在实际开发中的应用。通过对线程安全和锁机制的深入理解,可以帮助我们更好地解决并发编程中的问题,提高程序的性能和稳定性。
|
24天前
|
安全 Java 开发者
Java并发编程中的线程安全策略
在现代软件开发中,Java语言的并发编程特性使得多线程应用成为可能。然而,随着线程数量的增加,如何确保数据的一致性和系统的稳定性成为开发者面临的挑战。本文将探讨Java并发编程中实现线程安全的几种策略,包括同步机制、volatile关键字的使用、以及java.util.concurrent包提供的工具类,旨在为Java开发者提供一系列实用的方法来应对并发问题。
15 0
|
2月前
|
安全 Java 容器
Java一分钟之-并发编程:线程安全的集合类
【5月更文挑战第19天】Java提供线程安全集合类以解决并发环境中的数据一致性问题。例如,Vector是线程安全但效率低;可以使用Collections.synchronizedXxx将ArrayList或HashMap同步;ConcurrentHashMap是高效线程安全的映射;CopyOnWriteArrayList和CopyOnWriteArraySet适合读多写少场景;LinkedBlockingQueue是生产者-消费者模型中的线程安全队列。注意,过度同步可能影响性能,应尽量减少共享状态并利用并发工具类。
35 2