安卓最新面试系列专题 三(线程篇)

1.线程的生命周期

新建-------->就绪---(阻塞)----->运行------>死亡
在运行后有一个阻塞状态,主要是因为调用sleep和wait方法产生的,在阻塞线程抢到cpu的后会回到就绪状态。

2.线程创建的三种方法
  • 创建类继承Thread,重新run方法,调用start方法开启线程。
  • 创建类实现Runnable接口,重写run方法,创建Thread传入自己定义的runnable类,调用start方法
  • 创建类实现Callable接口,重写call方法,创建线程池调用submit()方法,传入参数为自定义的Callable,获得返回值Future对象,调用Future对象的get()方法获取call()方法执行完后的值。

三种创建方法的区别
因为在java是单继承,多实现。实现 Runnable 接口还可以继承其他类,而使用继承 Thread 就不能继承其他类了。所以当你想创建一个线程又希望继承其他类的时候就该选择实现 Runnable 接口的方式。
Callable 执行的方法是 call() ,而 Runnable 执行的方法是 run()。
call() 方法有返回值还能抛出异常, run() 方法则没有没有返回值,也不能抛出异常。

3.解决多线程安全问题

使用同步代码块

4.线程池的创建

一般是创建 ThreadPoolExecutor(参数);
其中参数为:

  • int CorePoolSize:核心线程数量。这几个核心线程,只是在没有用的时候,也不会被回收。
  • int maxiumPoolSize:线程池中可以容纳的最大线程的数量。
  • long keepAliveTime:线程池中非核心线程存活的时间。
  • TimeUnit unit : 计算线程保存时间的类。
  • BlockingQueue<Runnable> workQueue:等待队列,任务可以储存在任务队列中等待被执行,执行的是FIFIO原则(先进先出)。
  • ThreadFactory threadFactory :创建线程的线程工厂。
  • RejectedExecutionHandler handler :拒绝策略,当任务满了的时候会选择拒绝执行。
5.常见线程池
  • CachedThreadPool:可缓存的线程池,该线程池中没有核心线程,非核心线程的数量为Integer.max_value,就是无限大,当有需要时创建线程来执行任务,没有需要时回收线程,适用于耗时少,任务量大的情况。

  • SecudleThreadPool:周期性执行任务的线程池,按照某种特定的计划执行线程中的任务,有核心线程,但也有非核心线程,非核心线程的大小也为无限大。适用于执行周期性的任务。

  • SingleThreadPool:只有一条线程来执行任务,适用于有顺序的任务的应用场景。

  • FixedThreadPool:定长的线程池,有核心线程,核心线程的即为最大的线程数量,没有非核心线程。

6.如何让线程按顺序执行
  • 使用线程的join方法。
  • 使用线程池 SingleThreadPool。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 本文是我自己在秋招复习时的读书笔记,整理的知识点,也是为了防止忘记,尊重劳动成果,转载注明出处哦!如果你也喜欢,那...
    波波波先森阅读 11,721评论 4 56
  • 进程和线程 进程 所有运行中的任务通常对应一个进程,当一个程序进入内存运行时,即变成一个进程.进程是处于运行过程中...
    小徐andorid阅读 3,001评论 3 53
  •   一个任务通常就是一个程序,每个运行中的程序就是一个进程。当一个程序运行时,内部可能包含了多个顺序执行流,每个顺...
    OmaiMoon阅读 1,816评论 0 12
  • 刚进大学,我还有个男朋友。可惜耐不住人家要出国,异地恋都有待争议了,异国恋……我没考虑多久就提了分手。于是,我也成...
    网瘾少女叶阅读 529评论 3 9
  • yii2自带的例子里面有一个关于验证码的使用例子,但是本篇文章讨论的是用另外一种方式手动生成和验证验证码。 生成验...
    雨而已阅读 5,274评论 4 2

友情链接更多精彩内容