`
toknowme
  • 浏览: 139863 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

备战准备01--多线程

 
阅读更多
(1)线程池背景
Jdk1.5之后加入了java.util.concurrent包,这个包中主要介绍java中线程以及线程池的使用。为我们在开发中处理线程的问题提供了非常大的帮助。
 
(2)线程池
 
(2.1)线程池概念

诸如web服务器、数据库服务器、文件服务器和邮件服务器等许多服务器应用都面向处理来自某些远程来源的大量短小的任务。构建服务器应用程序的一个过于简单的模型是:每当一个请求到达就创建一个新的服务对象,然后在新的服务对象中为请求服务。但当有大量请求并发访问时,服务器不断的创建和销毁对象的开销很大。所以提高服务器效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁,这样就引入了“池”的概念,“池”的概念使得人们可以定制一定量的资源,然后对这些资源进行复用,而不是频繁的创建和销毁

线程池是预先创建线程的一种技术。线程池在还没有任务到来之前,创建一定数量的线程,放入空闲队列中。这些线程都是处于睡眠状态,即均为启动,不消耗CPU,而只是占用较小的内存空间。当请求到来之后,缓冲池给这次请求分配一个空闲线程,把请求传入此线程中运行,进行处理。当预先创建的线程都处于运行状态,即预制线程不够,线程池可以自由创建一定数量的新线程,用于处理更多的请求。当系统比较闲的时候,也可以通过移除一部分一直处于停用状态的线程。

 
(2.2)线程池作用
线程池作用就是限制系统中执行线程的数量
根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;少了浪费了系统资源,多了造成系统拥挤效率不高。、
 

如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。

  那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?

  在Java中可以通过线程池来达到这样的效果。今天我们就来详细讲解一下Java的线程池,首先我们从最核心的ThreadPoolExecutor类中的方法讲起

 
 
(2.3)为什么要用线程池

1.减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。

个人补充:tomcat处理Http请求也是使用的线程池,如下图所示



 

 

 

2.可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)

Java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具。真正的线程池接口是ExecutorService

 
 
(2.4)线程池核心类
比较重要的几个类:

ExecutorService

真正的线程池接口。(接口)

ScheduledExecutorService

能和Timer/TimerTask类似,解决那些需要任务重复执行的问题。(接口)

ThreadPoolExecutor

ExecutorService的默认实现。(实现)

ScheduledThreadPoolExecutor

继承ThreadPoolExecutorScheduledExecutorService接口实现,周期性任务调度的类实现。(实现)

要配置一个线程池是比较复杂的,尤其是对于线程池的原理不是很清楚的情况下,很有可能配置的线程池不是较优的,因此在Executors类里面提供了一些静态工厂,生成一些常用的线程池。

1. new SingleThreadExecutor

创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。

2.new FixedThreadPool

创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。

3. new CachedThreadPool

创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,

那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。

4.new ScheduledThreadPool

 

 

 

  • 大小: 76.3 KB
1
3
分享到:
评论

相关推荐

    Java多线程核心技术解析及常见面试题详解

    同时也是备战工作中可能遇到的各种多线程面试考题的有效参考资料。 阅读建议:此资源适合循序渐进地学习,先从简单的概念入手逐步过渡到较为复杂的主题,对于关键技术和实用的例子可以适当做一些练习加深理解和记忆...

    Java面试(2017备战)

    - **安全性**:不可变性意味着`String`对象不能被篡改,这对于多线程环境尤为重要,因为它消除了同步的需要。 - **性能优化**:编译器能够对`final`类型的变量进行优化,例如缓存常量值,从而提高执行效率。 2. *...

    2018蓝桥杯备战

    - Java:类和对象、集合框架、异常处理,以及多线程编程。 4. **问题解决策略**: - 分治法:将大问题分解为小问题,逐个解决后再合并答案。 - 贪心算法:每次做出局部最优选择,以期达到全局最优。 - 回溯法:...

    应届生该如何凭借JAVA获得大厂面试宝典

    - String不可变,而StringBuilder和StringBuffer可变,适合多线程环境。 - 了解它们在内存管理和性能上的差异。 2.1.21 构造方法: - 构造方法的作用,以及无参构造方法的重要性。 - 构造方法的特性,如自动调用...

    可能是2021年最全最硬核的Java面试 “备战” 资料(暗黑版).pdf

    死锁、活锁和饥饿现象是多线程编程中常见的问题,需要谨慎处理。 【反射】 反射是Java提供的一种在运行时分析类和对象的能力。通过Class类,我们可以获取类的信息,如类名、构造器、方法和字段。反射可用于动态...

    操作系统题目题集 备战考研必不可少的资料

    操作系统是计算机科学的基础课程之一,对于想要在IT领域深造,尤其是备战考研的学生来说,掌握操作系统的核心概念、原理和应用至关重要。这份“操作系统题目集”无疑是备考路上的重要参考资料。下面,我们将深入探讨...

    2024年Java常见的-BIO,NIO,AIO,Netty面试题

    - **定义**:NIO是一种同步非阻塞的I/O模型,它允许一个线程处理多个连接,通过多路复用器(Selector)来监控多个通道(Channel)的状态变化,只有当某个通道真正准备就绪时才会被唤醒进行处理。 - **应用场景**:...

    应届生JAVA开发校招-学长只能帮你到这了.doc

    3. JAVA 多线程编程:掌握 JAVA 多线程编程的基本概念,了解线程的创建、运行、同步等机制。 设计模式 1. Creational Pattern(创建型模式):了解 Factory Pattern、Abstract Factory Pattern、Builder Pattern ...

    个人Android面试经验分享

    面试官往往会通过提问一些Java基础概念来评估候选人的技术水平,比如Java的垃圾回收机制、多线程编程等。 - **建议:** - 深入理解Java中的面向对象特性、异常处理机制等。 - 学习并掌握Java集合框架的使用方法。...

    16-17年it名企技术岗笔试题汇总

    此外,UI设计、内存管理、性能优化、多线程、网络通信等也是常考内容。面试者可能需要编写简单的Android应用或解决特定的安卓平台问题。 测试工程师的笔试题通常涵盖软件测试理论,如黑盒测试、白盒测试、单元测试...

    java面试笔试题大汇总和面试试题

    Java作为世界上最受欢迎的编程语言之一,其面试和笔试题库涵盖了广泛的领域,包括基础语法、面向对象编程、集合框架、多线程、JVM、网络编程、设计模式、数据库交互等。以下是一些核心知识点的详细说明: 1. **基础...

    计算机专业秋招面经 C++开发方向.docx

    该资源首先聚焦于C++核心知识点的深入解析,包括但不限于面向对象编程、内存管理、多线程编程、STL(标准模板库)等。通过系统梳理和强化这些基础知识,帮助求职者打下坚实的理论基础。 同时,资源还覆盖了常见的...

    2024计算机秋招面经 C++开发方向.docx

    该资源首先聚焦于C++核心知识点的深入解析,包括但不限于面向对象编程、内存管理、多线程编程、STL(标准模板库)等。通过系统梳理和强化这些基础知识,帮助求职者打下坚实的理论基础。 同时,资源还覆盖了常见的...

    计算机秋招面经 C++开发方向.docx

    该资源首先聚焦于C++核心知识点的深入解析,包括但不限于面向对象编程、内存管理、多线程编程、STL(标准模板库)等。通过系统梳理和强化这些基础知识,帮助求职者打下坚实的理论基础。 同时,资源还覆盖了常见的...

    2019年_BATJ大厂面试题总结.7z

    4. 多线程:了解并发编程的基础,如线程同步、死锁避免、线程池的使用等。 5.IO流:理解字节流、字符流、缓冲流、转换流等,并能熟练运用在文件操作中。 6. 泛型:理解泛型的概念和使用,包括泛型类、泛型方法和...

    JAVA面试题最全集

    以上内容仅是“JAVA面试题最全集”的一部分,实际资料中可能包含更多高级主题,如Spring框架、JDBC、网络编程、多线程并发控制、数据库优化等。通过深入学习和实践这些知识点,你将在Java面试中展现出扎实的理论基础...

    C C++程序员面试宝典_面试宝典_

    8. **并发编程**:在多线程环境下,面试官可能会询问线程同步(如mutex、condition_variable)、线程池、死锁等问题,以评估候选人的并发编程能力。 9. **文件I/O**:理解和使用C/C++进行文件读写操作,包括文本...

    java蓝桥杯练习代码.zip

    进阶主题的掌握,如面向对象编程、异常处理、集合框架、多线程等;以及算法和数据结构的学习,这是解决复杂问题的基础。 【文件名:test】 在Java编程中,"test"常常作为测试文件或类的名称,用于验证代码的正确性...

    c++大纲资料.txt

    网络编程部分涵盖了套接字基础,TCP与UDP编程,Boost.Asio网络库的使用,以及多线程网络服务器和客户端的开发。最后,C++11/14/17新特性部分介绍了自动类型推导(auto)、Lambda表达式、基于范围的for循环、右值引用...

    唤醒:计算机基础(计算机网络操作系统数据库Git ...)面试问题全面总结,包含详细的跟进问题以及答案;全部采用【问题+追问+答案】的形式,即拿即用,直击互联网大厂面试;可用于模拟面试,面试前复习,短期内快速备战面试。

    如何使用Python实现多线程?理解并能够应用Python的关键特性,将增加你在面试中的竞争力。 总的来说,《唤醒:计算机基础面试问题全面总结》提供的资料全面而实用,适合面试前的速成复习。通过深入学习和理解这些...

Global site tag (gtag.js) - Google Analytics