@Android程序员:这-5-道刁钻的线程相关题,你会几道?,阿里大神最佳总结Flutter进阶学习笔记

36 阅读4分钟
  • 在Activity中被创建:该Thread的就是为这个Activity服务的,完成这个特定的Activity交代的任务,主动通知该Activity一些消息和事件,==Activity销毁后,该Thread也没有存活的意义了。==

  • 在Service中被创建:这是保证最长生命周期的Thread的唯一方式,==只要整个Service不退出,Thread就可以一直在后台执行==,一般在Service的onCreate()中创建,在onDestroy()中销毁。所以,在Service中创建的Thread,适合长期执行一些独立于APP的后台任务,比较常见的就是:在Service中保持与服务器端的长连接。

2.IntentService有什么用 ?

IntentService 是 Service 的子类,是一个异步的,会自动停止的服务,很好解决了传统的 Service 中处理完耗时操作忘记停止并销毁 Service 的问题,生成一个默认的且与线程相互独立的工作线程执行所有发送到onStartCommand()方法的 Intent,可以在 onHandleIntent()中处理. 串行队列,每次只运行一个任务,不存在线程安全问题,所有任务执行完后自动停止服务,不需要自己手动调用 stopSelf()来停止

3.除了notify还有什么方式可以唤醒线程?

  • 当一个拥有Object锁的线程调用 wait()方法时,就会使当前线程加入object.wait 等待队列中,并且释放当前占用的Object锁,这样其他线程就有机会获取这个Object锁,获得Object锁的线程调用notify()方法,就能在Object.wait 等待队列中随机唤醒一个线程(该唤醒是随机的与加入的顺序无关,优先级高的被唤醒概率会高)

  • 如果调用notifyAll()方法就唤醒全部的线程。注意:调用notify()方法后并不会立即释放object锁,会等待该线程执行完毕后释放Object锁。

4.线程池中的几个参数是什么意思,线程池的种类有哪些?

线程池的构造函数如下:

public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue) { this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, Executors.defaultThreadFactory(), defaultHandler);}

参数解释如下:

· corePoolSize:核心线程数量,不会释放。

· maximumPoolSize:允许使用的最大线程池数量,非核心线程数量,闲置时会释放。

· keepAliveTime:闲置线程允许的最大闲置时间。

· unit:闲置时间的单位。

· workQueue:阻塞队列,不同的阻塞队列有不同的特性。

线程池分为四个类型:

· CachedThreadPool:闲置线程超时会释放,没有闲置线程的情况下,每次都会创建新的线程。

· FixedThreadPool:线程池只能存放指定数量的线程池,线程不会释放,可重复利用。

· SingleThreadExecutor:单线程的线程池。

· ScheduledThreadPool:可定时和重复执行的线程池。

5.Handler、Thread和HandlerThread的差别?

  • Handler:在android中负责发送和处理消息,通过它可以实现其他支线线程与主线程之间的消息通讯。

最后

希望本文对你有所启发,有任何面试上的建议也欢迎留言分享给大家。

好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划,可以加一下下面的技术群来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。

这里放一下资料获取方式:GitHub

好了~如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。

为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!希望读到这的您能点个小赞和关注下我,以后还会更新技术干货,谢谢您的支持!