多线程相关问题

一、理论基础

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、常见的池化技术主要有
线程池、
数据库连接池、
内存池、
对象池

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值