在《阿里巴巴 Java 开发手册》“并发处理”这一章节,明确指出线程资源必须通过线程池提供,不允许在应用中自行显示创建线程。
为什么呢?
使用线程池的好处是减少在创建和销毁线程上所消耗的时间以及系统资源开销,解决资源不足的问题。如果不使用线程池,有可能会造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题。
另外《阿里巴巴 Java 开发手册》中强制线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 构造函数的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险
Executors 返回线程池对象的弊端如下:
FixedThreadPool
和SingleThreadExecutor
: 允许请求的队列长度为 Integer.MAX_VALUE,可能堆积大量的请求,从而导致 OOM。- CachedThreadPool 和 ScheduledThreadPool : 允许创建的线程数量为 Integer.MAX_VALUE ,可能会创建大量线程,从而导致 OOM。
方式一:通过ThreadPoolExecutor
构造函数实现(推荐) 方式二:通过 Executor 框架的工具类 Executors 来实现 我们可以创建三种类型的 ThreadPoolExecutor:
对应 Executors 工具类中的方法如图所示:
问题内容: 我是Java技术的新手。我知道在Java中只有两种创建方式 扩展线程类 实施可运行接口 因此,这只是两种创建方法。但是,当我们使用主JVM启动程序时,它启动了一个main 。我认为甚至JVM也必须遵循创建主要方法的规则,以创建主线程JVM必须扩展Thread类或实现。 我尽了最大的努力,但是不知道JVM是如何创建这个主要对象的。当我完全遍历主类()时,我知道这是负责主线程的类。但是在G
我在很多地方读过,线程池减少了线程创建开销,从而提高了性能。但是一旦线程执行完它的run方法,它就会进入dead/terminated状态,这意味着它可以再次重新启动。 那么,线程池如何处理线程的释放呢?它是否真的以某种方式保存线程以服务下一个任务,或者在每次提交任务时在内部创建新线程?
问题内容: 有什么方法可以创建线程以一次运行多个方法吗? 这样,如果任何方法在所有其他线程之间失败,则应终止。 问题答案: 每个node.js进程在设计上都是单线程的。因此,要获得多个线程,您必须具有多个进程(正如其他一些发帖人所指出的那样,您还可以链接到一些库,这些库使您能够使用Node中的线程,但是没有这些库就没有这种能力。请参阅Shawn Vincent的回答,参考https://githu
问题内容: 抱歉,这个问题很愚蠢。我试图在网上找到答案已有一段时间,但找不到,因此我在这里提问。我正在学习线程,并且一直在浏览此链接以及有关内核级和用户级线程的2013年Linux Plumbers Conference 2013视频 ,据我了解,使用pthreads在用户空间中创建线程,而内核并不知道关于此问题,并且仅将其视为单个进程,而不知道内部有多少个线程。在这种情况下, 内核在将进程视为时
在进程获得的时间间隔内,谁决定这些用户线程的调度,因为内核将其视为单个进程,并不知道线程,调度是如何完成的? 如果pthreads创建用户级线程,如果需要,如何从用户空间程序创建内核级或OS线程? 根据上面的链接,它说操作系统内核提供系统调用来创建和管理线程。那么,系统调用是创建内核级线程还是用户级线程呢? 如果它创建了一个内核级线程,那么简单pthreads程序的也会显示在执行时使用clone(
线程的创建 接下来,我们的第一个目标就是创建一个线程并且让他运行起来。一个线程要开始运行,需要这些准备工作: 建立页表映射,需要包括以下映射空间: 线程所执行的一段指令 线程执行栈 操作系统的部分内存空间 设置起始执行的地址 初始化各种寄存器,比如 sp 可选:设置一些执行参数(例如 argc 和 argv等 ) 思考:为什么线程即便与操作系统无关,也需要在内存中映射操作系统的内存空间呢?Clic