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

浅谈多线程在java程序中的应用

    博客分类:
  • java
阅读更多

在一个高并发的网站中,多线程是必不可少的。下面先说一下多线程在程序中的作用。

1、提高前端请求的响应速度。当我们执行一个比较耗时的方法时,http请求得不到响应甚至会超时,这时如果业务上允许数据的延迟,我们可以使用多线程来进行处理比较耗时的方法。这样前端发送了请求,后端令开启了一个线程去处理任务,就不会阻塞主线程了。

2、减清服务器的压力。包括我们的web容器,如tomcat、jetty等,还有数据库服务器等。因为我们使用了多线程,并且线程池大小有限制,如30,那么同时请求数据库的链接就限制为30了,也就是说能够同时执行方法的线程只有30个,其余的任务都放在我们线程的任务队列了,这样数据库就不会被突然上来的请求给压垮了。当然对于缓解数据库压力来说,更建议使用消息队列,使用消息队列我们可以攒数据进行批量提交,而仅仅使用多线程,则不好实现攒数据的过程。

3、提高处理能力,增加性能,充分利用服务器资源。如我们要将三个表里的数据加载到缓存,最简单的我们一个表开启一个线程,共用三个线程去加载缓存则比用一个线程去挨着遍历三个表的数据高效的多。

 

当然,多线程给我们带来好处的同时,也有许多要注意的地方

1、既然我们使用了多线程,那我们就对数据的实时性不那么严格,包括方法的返回值、数据的入库操作等。所以说,使用多线程的方法一定要做好日志记录,因为发生了异常,前端是反馈不到的。当然,多线程也是可以有返回值的,可以返回Future,里面的get方法可以阻塞到该线程执行完毕。

2、我觉得最烦人的是,为了提高性能,程序必须使用多线程或者其他异步操作,但还必须保证用户体验,如用户进行修改操作,这个修改操作我们是异步的,要求用户在前端还必须立刻看到修改的结果。这样就需要前后端同时去努力了。

3、非常重要的一点就是线程安全的问题了,如我们对一个集合的数据进行修改,在多线程高并发情况下,如果处理不好,可能会出现些我们意想不到的结果。即使我们没有使用多线程,在高并发情况下,线程安全问题是我们必须要重视。举个例子说吧,在我们进行压力测试的时候,当登陆人数压到10w的时候,读取分页列表的时候老是抱些奇怪的异常,但压得人数少了,或者说我们自己单独测试,则不会出现异常。检查一看,原来是我们使用的某个分页插件里有一个判断某个集合是否为空,如果为空则初始化的操作,因为这个集合是全局变量,所以人一多,就会出现线程安全问题。

4、对于自己不确定有多少线程的操作,一定要使用线程池,不然不但提高不了性能,反而会降低性能,甚至会导致jvm内存满了。

5、对于线程池大小的问题,也有很多说明这些问题的文章,什么区分是io还是cpu密集型的,我认为也不必非要那么严格去计算出那么一个数,测试达到自己的要求即可。

 

上面说了一堆乱七八糟的理论,下面说一下java程序中如何使用线程池,

1、可以直接使用new ThreadPoolExecutor()去创建,但此方法比较麻烦,如没有特殊需求,不建议使用该方法

 

2、使用java提供的Executors类去创建一个线程,我们比较常用的,如:

ExecutorService executor=Executors.newFixedThreadPool(10);//通过该方法则创建了一个大小为10,且任务队列无界的线程池,其实该方法本质也是调用方法1中的方法。Executors中还可以创建其他类型的线程,如Executors.newCachedThreadPool(),Executors的具体使用这里不再进行叙述。

 

3、spring也给我们提供了比较方便的线程池初始化方法,当然它本质也是调用1中的方法。使用方法如下:

 <!-- 在spring扫描的配置文件里加入以下配置,则声明了一个大小为5的线程池 -->
 < task:executor id="addnotic" pool-size="5"/>

在java程序中,我们通过@Autowired或@Resource注入即可,如

@Resource(name="addnotic")
private ThreadPoolTaskExecutor addnotic_executor;

 

因为我们项目使用了spring,所以对于线程池我们一般都是使用方法3中的方法使用的,挺方便的。

 

 

 本文内容大体就这些,若大家觉得说的有什么不好的地方,请指正,谢谢

 

 

分享到:
评论

相关推荐

    浅谈多线程_让程序更高效的运行

    【多线程】是计算机编程中的一个重要概念,它允许程序在同一时间内执行多个任务,从而提高了程序的执行效率。在Java中,多线程是通过创建并运行多个线程来实现的,每个线程代表着进程中的一条独立控制流。Java线程是...

    浅谈JAVA中多线程的实现.zip

    在Java编程语言中,多线程是程序设计中的一个重要概念,尤其在开发高效能、响应迅速的应用时。本文将深入探讨Java中多线程的实现,帮助开发者理解如何利用这一特性来优化应用程序。 多线程是指在一个程序中同时运行...

    浅谈JAVA语言的多线程技术.pdf

    在JAVA程序中实现多线程有两种途径:一种是直接继承java.lang.Thread类并重写其run()方法;另外一种是实现Runnable接口,并重写run()方法。 (一)利用Thread类创建的子类实现多线程 可以通过直接实例化Thread对象...

    浅谈Java的多线程机制.pdf

    ### 浅谈Java的多线程机制 #### 一、引言 随着计算机技术的不断发展,编程模型变得越来越复杂和多样化。多线程编程模型作为目前计算机系统架构中的一个重要组成部分,其重要性日益凸显。特别是在X86架构的硬件成为...

    浅谈Java程序设计在线开放课程.zip

    "浅谈Java程序设计在线开放课程"这个主题,将深入探讨Java语言的核心概念、编程实践以及如何通过在线平台有效地学习这门技术。 Java以其“一次编写,到处运行”的跨平台特性,成为了企业级应用开发的首选语言。课程...

    浅谈计算机操作系统中线程与超线程技术及应用.pdf

    Java的线程模型基于操作系统线程,Python则在早期版本中使用了全局解释器锁(GIL),限制了多线程在CPU密集型任务中的并行性,但在多线程I/O操作上仍能发挥优势。Python的后期版本和一些库如Jython、PyPy等,通过...

    浅谈项目教学法在JAVA语言教学中的应用.zip

    在这些项目中,他们将接触到类的设计、对象的创建、数据结构的应用、异常处理、多线程编程等Java核心概念。通过编写代码,学生能够直观地看到每个概念如何在实际场景中发挥作用。 其次,项目教学法促进团队协作。在...

    浅谈java多线程wait,notify

    _java多线程wait、...本文中,我们详细介绍了Java多线程wait和notify机制的使用,并通过示例代码展示了其应用。通过这篇文章,读者可以更好地理解和掌握wait和notify机制,从而更好地编写高效、可靠的多线程程序。

    Java同步机制浅谈

    `synchronized`关键字主要用于解决Java应用程序中的多线程同步问题。它可以应用于方法和代码块,帮助开发者控制对共享资源的访问,从而保证数据的一致性和安全性。 1. **同步方法**:当`synchronized`关键字用于...

    浅谈java语言在技校教学中的实践与探索.pdf

    "浅谈java语言在技校教学中的实践与探索" Java语言是一种现代化的编程语言工具,具有易于学习、执行方式效率高、跨平台性、可移植性、安全性高、多线程设计等优点,更加适合Internet程序开发。Java语言课程是技校...

    浅谈java连接池

    Java 连接池是一种优化数据库访问效率的机制,它解决了在Web应用程序中频繁建立和释放数据库连接所导致的性能问题。随着B/S架构的广泛应用,Java应用程序通过JDBC(Java Database Connectivity)与数据库进行交互。...

    浅谈高职高专Java基础教学.pdf

    这将集中体现在程序语言对内存管理、代码托管、异常处理、多线程方面的自动化和智能化。 二、注重基础教学,教学中增加趣味教学的分量 高职高专学生对基础知识的掌握较差,他们往往是“只知其然,不知其所以然”,...

    浅谈JAVA集合框架及其应用.pdf

    本文将从源码分析角度出发,深入探讨Java集合框架中常用的接口和实现类的底层数据结构及其特点,并探讨其在实际业务开发中的应用选择。 Java集合框架中的数据结构主要分为两大类:Collection集合和Map集合。...

    浅谈java集合框架

    ### 浅谈Java集合框架 Java集合框架是一个用于存储、操作和检索一组对象的强大工具集。集合框架的设计目的是为了提供一套高效且灵活的数据结构来满足不同的应用需求。本篇文章将详细探讨Java集合框架中的一些核心...

    浅谈Java多线程的优点及代码示例

    在Java中,多线程通过创建线程对象来实现,每个线程代表程序中的一个独立执行流。 **资源利用率更好** 在单线程环境中,如果程序在等待某个I/O操作(如磁盘读取或网络通信)完成时,CPU往往处于空闲状态。多线程...

    浅谈java中异步多线程超时导致的服务异常

    在Java编程中,异步多线程是一种常见的优化性能的方式,尤其在处理高并发场景时。这种方式通过将任务分配到不同的线程上,使得多个任务可以并行执行,从而提高程序的运行效率。然而,如果不正确地管理和控制线程,...

    浅谈python多线程和队列管理shell程序

    在Python编程中,多线程和队列管理是非常重要的技术,尤其当涉及到并发处理多个任务时。本文将深入探讨Python中的多线程以及如何利用队列来管理和监控这些线程的状态。 #### 一、Python多线程简介 Python的多线程...

    浅谈java中nio的使用方式

    在这些应用中,服务器通常需要同时处理大量并发连接,而传统的阻塞IO模型会导致服务器为每个连接创建一个线程,消耗大量资源。使用NIO,一个线程就可以通过Selector来管理多个Channel,显著降低了线程创建和上下文...

Global site tag (gtag.js) - Google Analytics