2021Android面试题----进程和线程

1.能简单说说线程和进程间的区别吗? 

概念:进程包括多个线程,一个程序一个进程,多线程的优点可以提高执行效率,提高资源利用率
创建:Thread类和Runnable接口,
常用方法有:
start()用于启动线程
run()调用线程对象中的run方法
join()合并插队到当前线程
sellp()睡眠释放cpu资源
setPriority()设置线程优先级

 2.跨进程通信的几种方式

   1.Intent,比如拨打电话
   2.ContentProvider数据库存储数据
   3.Broadcast广播通信
   4.AIDL通信,通过接口共享数据

 4.听说过Messenger吗?
(其实底层还是使用的AIDL+Handler的形式,AIDL底层还是使用的Binder驱动)
5.如何终止一个线程
6.列出几种线程池
7.创建多线程方式、线程池工作原理
8.解释一下volatile字段
9.解释一下synchronized字段
10.synchronized和lock的区别
11.wait()和sleep()区别
12.死锁产生的条件
13. Lock的使用
14.能简单说说线程和进程间的区别吗?
 
 
17.如何终止一个线程
18.列出几种线程池
19.创建多线程方式、线程池工作原理

20.线程池的基本机制有了解吗?非核心线程如何保证延迟结束?

21.HandlerThread

HandlerThread本身也是Thread,只是在Thread基础上封装上了Handler的载体,并且在run方法中创建了looper对象,这也是为什么在IntentService中能在HandlerThread中直接用handler的原因。而我们知道一个线程是可以有多个handler,所以用HandlerThread更加方便我们不用关心Handler的创建,一般用在多线程中直接处理任务。 

22.线程锁 锁方法和类对象啥的有啥区别

线程锁锁方法:是需要等到该线程用完了该方法才能释放同步锁
线程锁锁类对象:是需要等到该线程用完了该类对象才能释放同步锁
区别:是锁方法的区域要小 锁类对象包括了该类的所有属性  

23.AsyncTask原理 

  AsyncTask主要是对android中java的线程池的封装,该类中默认开启了两个线程池,一个线程池负责任务的排队处理,保证任务被单个处理,另外一个线程池用来专门处理任务,最后任务处理完了,交给Handler发送消息到主线程,然后Handler处理线程,交给了onPostExecute方法。
内部过程:

AsyncTask初始化阶段创建了WorkerRunnable对象,它是处理doInBackground的Callable对象,接着创建了FutureTask对象,它是将上面WorkerRunnable包装了一层的Runnable和Future对象,实际上线程池要执行的任务就是该WorkerRunnable对象。

在执行任务过程中,通过SerialExecutor对象来排队处理FutureTask,里面通过ArrayDeque来按顺序取出FutureTask,取出后交给了THREAD_POOL_EXECUTOR对象,它是在静态代码块中创建的线程池,所以说THREAD_POOL_EXECUTOR才是正真执行任务的关键地方。

执行完后,剩下的就是主线程的Handler将消息发送到主线程去处理。

23.1  AsyncTask内部会创建一个线程池?

两个线程池,一个线程池负责排队处理任务;另一个线程池用来负责处理FutureTask,也就是将上面WorkerRunnable包装了一层的Runnable对象。

23.2   AsyncTask对此执行excute方法会怎样?

直接抛出IllegalStateException(非法状态异常)  

24.AsyncTask的作用,如何使用(包括有哪些方法,能说出同步异步,能说出不同Android版本下的区别加分)

25.有哪些异步的方式?

26.Handler机制

57.Handler的缺点,会不会造成内存泄漏,有则如何解决

28 wait和 sleep 的区别

wait是Object的方法,wait是对象锁,锁定方法不让继续执行,当执行notify方法后就会继续执行,sleep 是Thread的方法,sleep 是使线程睡眠,让出cpu,结束后自动继续执行

29.Hander原理

Handler,loop轮询检测发送消息到MessagerQuery,MessageQuery对Message入列,Handler回调方法处理消息,重写handMessage方法刷新ui

30.AsyncTask使用在哪些场景?它的缺陷是什么?如何解决?


AsyncTask 运用的场景就是我们需要进行一些耗时的操作,耗时操作完成后更新主线程,或者在操作过程中对主线程的UI进行更新。

缺陷:AsyncTask中维护着一个长度为128的线程池,同时可以执行5个工作线程,还有一个缓冲队列,当线程池中已有128个线程,缓冲队列已满时,如果 此时向线程提交任务,将会抛出RejectedExecutionException。

解决:由一个控制线程来处理AsyncTask的调用判断线程池是否满了,如果满了则线程睡眠否则请求AsyncTask继续处理。

 31.Android 线程间通信有哪几种方式(重要)


共享内存(变量);

文件,数据库;

Handler;

Java里的wait(),notify(),notifyAll() 

32.什么是 AIDL?如何使用?


aidl 是 Android interface definition Language 的英文缩写,意思 Android 接口定义语言。

使用 aidl 可以帮助我们发布以及调用远程服务,实现跨进程通信。

将服务的 aidl 放到对应的 src 目录,工程的 gen 目录会生成相应的接口类

我们通过 bindService(Intent,ServiceConnect,int)方法绑定远程服务,在 bindService中 有 一 个 ServiceConnec 接 口 , 我 们 需 要 覆 写 该 类 的onServiceConnected(ComponentName,IBinder)方法,这个方法的第二个参数 IBinder 对象其实就是已经在 aidl 中定义的接口,因此我们可以将 IBinder 对象强制转换为 aidl 中的接口类。我们通过 IBinder 获取到的对象(也就是 aidl 文件生成的接口)其实是系统产生的代理对象,该代理对象既可以跟我们的进程通信, 又可以跟远程进程通信, 作为一个中间的角色实现了进程间通信。复制代码

33.AIDL 的全称是什么?如何工作?能处理哪些类型的数据?


AIDL 全称 Android Interface Definition Language(AndRoid 接口描述语言) 是一种接口描述语言; 编译器可以通过 aidl 文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程跨界对象访问的目的。需要完成两件事情:

引入 AIDL 的相关类.;

调用 aidl 产生的class复制代码

理论上, 参数可以传递基本数据类型和 String, 还有就是 Bundle 的派生类, 不过在 Eclipse 中,目前的 ADT 不支持 Bundle 做为参数。

34.描述下Handler 机制


1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列)。

2)Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到MessageQueue里;或者接收Looper从Message Queue取出)所送来的消息。

Message Queue(消息队列):用来存放线程放入的消息。
4)线程:UIthread 通常就是main thread,而Android启动程序时会替它建立一个MessageQueue。 

Hander持有对UI主线程消息队列MessageQueue和消息循环Looper的引用,子线程可以通过Handler将消息发送到UI线程的消息队列MessageQueue中。

35.子线程发消息到主线程进行更新 UI,除了 handler 和 AsyncTask,还有什么?


用 Activity 对象的 runOnUiThread 方法更新

在子线程中通过 runOnUiThread()方法更新 UI:

如果在非上下文类中(Activity),可以通过传递上下文实现调用;复制代码

用 View.post(Runnable r)方法更新 UI

36.子线程中能不能 new handler?为什么?


不能,如果在子线程中直接 new Handler()会抛出异常 java.lang.RuntimeException: Can'tcreate handler inside thread that has not called

在没有调用 Looper.prepare()的时候不能创建 Handler,因为在创建 Handler 的源码中做了如下操作

Handler 的构造方法中

37 请介绍下 AsyncTask 的内部实现和适用的场景

AsyncTask 内部也是 Handler 机制来完成的,只不过 Android 提供了执行框架来提供线程池来执行相应地任务,因为线程池的大小问题,所以 AsyncTask 只应该用来执行耗时时间较短的任务,比如 HTTP 请求,大规模的下载和数据库的更改不适用于 AsyncTask,因为会导致线程池堵塞,没有线程来执行其他的任务,导致的情形是会发生 AsyncTask 根本执行不了的问题

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

幸福在路上wellbeing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值