面试题之---java多线程

(一)多线程

1,概念介绍

   

   一般一个应用至少一个进程,一个线程,线程是进程的一个实体,是CPU调度和分派的基本单位.
最简单的比喻多线程就像火车的每一节车厢,而进程则是火车。车厢离开火车是无法跑动的,同理火车也不可能只有一节车厢。

    在操作系统中,线程是最小的调度单元,同时又是一种受限的资源,所以不可能无限制的产生,它的创建和销毁都是比较耗性能的.

    因此,要尽量使用线程池,来管理线程,避免过多创建和销毁对象带来的开销.

2,线程的作用

   一般,在默认情况下,一个进程就只有一个线程,也就是主线程.让进行交互操作.为了用户操作的流畅性,就不能在主线程进行一些耗时操作,比如网络请求,I/O操作,这个时间一长,就容易造成ANR现象.

   所以这个时候.就要开启子线程,进行耗时操作,最后通过Handler,AsyncTask,Rxjava等异步类将结果传递到主线程,进行UI更新.

3,线程的生命周期

   新建:线程被创建,还没有调用start()

   就绪(调用start()之后),

   运行(执行run()之后),

   阻塞(线程被暂停),

   死亡(线程被停止))

(二)线程池

  1,优点:

   A,可以避免不断的创建和销毁线程带来的开销

   B,能够有效的控制线程池的最大并发数,避免大量的线程之间因互相抢占系统资源而导致的阻塞现象.

   C,能够提供定时执行和间隔循环执行等功能.

 

   2,ThreadPoolExcutor的构造方法中的6个重要参数:

   A,CorePoolSize,线程池的最大核心线程数量.默认情况下,会一直存活.除非设置allowCoreThreadTimeOut属性为true,那只要超过KeepAliveTime设定的闲置时长,也会被回收.

   B,maximumPoolSize,线程池能够容纳的最大线程数,当活动线程达到这个数据,后续的新任务就不会执行

   C,keppAliveTime,非核心线程的闲置时长.如果非核心线程的闲置时间超过这个时长,就会被回收.

但,allowCoreThreadTimeOut属性被设置为true,只要超过KeepAliveTime设定的闲置时长,核心线程也会被回收.

  D,unit,keepAliveTime闲置时长的单位.这是一个枚举,常用的有TimeUnit.MILLISECOND(毫秒),TimeUnit.SECOND(秒),TimeUnit.MINUTES(分钟)等.

   E,workQueue,线程池中的任务队列,通过线程池的execute()方法提交的Runnable对象会存储在这个参数中.

  F,threadfactory,为线程池提供创建新线程的功能.它是一个接口,只有一个抽象方法, Thread newThread(Runnnable r);

 

3,ThreadPoolExecutor执行顺序:

   A,当活动的核心线程数量未达到设定的核心线程数量时,就会直接启动一个核心线程来执行任务

   B,当活动的核心线程数量达到设定的核心线程数量时,就会让任务到任务队列中排队.

   C,在步骤B中,若任务队列排满了以后,就会立即启动一个非核心线程来执行任务.

   D,如果线程数量达到线程池规定的最大值时,那就会拒绝执行此任务.ThreadPoolExecutor就会调用RejectedExecutorHandler的rejectedExecutor()方法来通知调用者.

   E,当任务执行完,就会一个一个的回收非核心线程.核心线程不会自动回收,即使闲置,也会存在,除非自己将allowCoreThreadTimeOut属性设为true.

 

4,线程池的分类:

 FixedThreadPool,CacheThreadPool,ScheduledThreadPool,SingleThreadPool,

A,FixedThreadPool,

       线程数量固定,

  只有核心线程,且不会被回收,能快速响应外界请求

  当所有线程在活动时,新任务会处于等待状态

  对列没有大小限制

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4);
fixedThreadPool.execute(myRun);

 

B,CacheThreadPool,

  线程数量不定,

 只有非核心线程,最大数量为Integer.MAX_VALUE

 闲置时间超过60秒,就会被回收

 适合执行大量的耗时少的任务

ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
cachedThreadPool.execute(myRun);

 

 

   C,ScheduledThreadPool

        核心线程数量固定,非核心线程数量不固定

  非核心线程一旦闲置,就会被回收

  主要用于执行定时任务,具有固定周期的重复任务

ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(4);
//1秒后执行Runnable
scheduledThreadPool.schedule(myRun,1000, TimeUnit.MILLISECONDS);
//延迟20毫秒后,每个2秒就执行一次Runnable
scheduledThreadPool.scheduleAtFixedRate(myRun,20,2000,TimeUnit.MILLISECONDS);

 

 

D,SingleThreadPool

       只有一个核心线程

  将外界任务统一到一个线程,这样任务之间就不需要处理线程同步的问题

ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
singleThreadExecutor.execute(myRun);

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值