• 多线程相关问题


    一、理论基础

    1、为什么用使用多线程技术

    (1)、抢CPU,充分抢占服务器的cpu核心数,单个cpu时间切片处理程序的时间值相对比较固定,要提高程序整体的运行速度,就可以采用多个cpu核同步来工作,达到抢占cpu计算资源,提高自身程序的运行速度的目的

    (2)抢业务资源,对特定资源的争夺时,多线程能提高程序运行的稳定性,增强用户体验。如电商秒杀,12306抢票,资源的总量有限,但是并发的数量却非常高。如果单用单线程,一旦线程出现阻塞,所有的请求都将会收到影响,而采用多线程,既可以同时处理大量的数据请求,单一线程阻塞并不会影响程序整体的稳定运行。既增强了用户体验,又提高了程序的稳定性。

    (3)、抢集群资源,提高I/O吞吐量,在分布式集群的环境中,关系型数据库和非关系型数据库大多采用分布式集群搭建,业务节点服务器采用一主多从或多主多从。采用多线程,可以充分利用集群构建的I/O通道,提高程序运行销量。

    二、实现多线程的几种方式

    1.继承Thread类,重写run方法;
    2.实现Runnable接口,重写run方法;
    3.实现Callable接口,重写call方法;
    4.通过线程池实现多线程(实现Runnable接口+Executors创建线程池)

    1、【继承Thread类,重写run方法】

    优点:简单,且只需要实现父类的run方法即可(start方法中含有run方法,会创建一个新的线程,而run是执行当前线程)。

    缺点:Java的单继承,如果对象已经继承了其他的类则不能使用该方法。且不能获取线程的返回值

    2、【实现Runnable接口】

    优点:简单,实现Runnable接口必须实现run方法。

    缺点:创建一个线程就必须创建一个Runnable的实现类,且不能获取线程的返CallabTask优点:可以获取多线程的返回值。缺点:每个多线程都需要创建一个Callable的实现类

    3、【实现Callable接口,重写call方法】
    **优点:**实现Callable接口,重写call方法,Callable的任务执行后可返回值,而Runnable的任务是不能返回值的
    缺点自定义类实现Callable接口时,必须指定泛型,该泛型即返回值的类型,每次创建一个新的线程,都要创建一个新的Callable接口的实现类。

    4、【线程池ExecutorService和工具类Executors】

    优点:可以根据实际情况创建线程数量,且只需要创建一个线程池即可,也能够通过Callable和Future接口得到线程的返回值,程序的执行时间与线程的数量紧密相关。

    缺点:需要手动销毁该线程池(调用shutdown方法)。

    三、引申出来常见的池化技术

    1、池化技术
    池 是在计算机技术中经常使用的一种设计模型,其内涵在于:将程序中需要经常使用的核心资源先申请出来,放到一个池内,由程序自己管理,这样可以提高资源的使用效率,也可以保证本程序占有的资源数量。

    **核心:**因为在Java中这些对象实例被经常使用到,频繁的创建和销毁需要大量的时间和计算资源,延长了程序运行时间和降低程序稳定性。所以用池化技术来统一管理,由相应的池对象来负责统一的创建和管理,需要用的时候,找池对象来取就可以。多路复用I/O也是池化技术思想的具象化。

    2、常见的池化技术主要有
    线程池、
    数据库连接池、
    内存池、
    对象池

  • 相关阅读:
    Java 内置包装类——System类详解
    sql库函数
    cartographer_optimization_problem_2d
    作为数据分析师,如何能把AI工具和数据分析工作更好的结合?
    ui_admin_vue3启动
    [附源码]Java计算机毕业设计SSM翻转课堂微视频管理系统
    计算机毕业设计ssm家教管理系统dpf3v系统+程序+源码+lw+远程部署
    C++库封装JNI接口——实现java调用c++
    Interview preparation--案例加密后数据的模糊查询
    毕业工作还没2年,跳到下一个公司就30K了,好家伙···
  • 原文地址:https://blog.csdn.net/weixin_44870066/article/details/125492054