熟练运用多线程、进程、Binder 通信等编程技术,通过源码分析 Binder 原理
一、线程和进程
线程与进程的不同之处
1、起源不同 进程先于线程出现,线程的出现是为了提高CPU的利用,提高程序的运行效率。
2、概念不同 进程是具有独立功能的一个程序运行起来的活动,是系统分配资源和调度的单位;线程是cpu的基本调度单位。
3、内存共享方式不同 进程间不能直接通信,只能通过高级技巧IPC实现,线程间可以直接访问彼此的一些内存。
4、拥有资源不同 线程拥有的资源少于进程。
5、数量不同 一个进程中可以包含有多个线程,至少包含一个线程。
6、开销不同 进程创建、终止时间都比线程要长;同一进程中的线程切换时间也比进程要短。
线程的创建: 继承Thread[或使用匿名内部类New Thread(){}]或者实现Runnable接口
java
public class ThreadA extends Thread{
@Override
public void run() {
super.run();
}
}
new Thread(
new Runnable() {
@Override
public void run() {
}
}
).start();
//lambda表达式
new Thread(
()->{
}
).start();
public class ThreadA implements Runnable{
@Override
public void run() {
}
}
**线程的关闭:**标志位控制、 interrupt()中断机制或stop()方法 (该方法已标记为已废弃)
原理 :通过volatile修饰的布尔变量作为退出标志,线程在循环中定期检查该标志以决定是否终止。
优点:安全可控,避免资源未释放问题。
标志位控制
java
public class MyThread extends Thread {
private volatile boolean running = true;
public void run() {
while (running) { /* 任务逻辑 */ }
}
public void stopThread() { running = false; }
}
interrupt()中断机制
原理 :调用interrupt()设置线程中断状态,线程需通过isInterrupted()检查或捕获InterruptedException响应中断。
java
while (!Thread.interrupted()) { /* 任务逻辑 */ }
stop()方法 (该方法已标记为已废弃)
强制终止线程可能发哦之锁未释放、数据不一致等问题。
线程间通信的方式:
1、Handler机制
java
// 工作线程发送消息
new Thread(() -> {
Message msg = Message.obtain();
msg.what = 1;
msg.obj = "Data from worker";
mainHandler.sendMessage(msg);
}).start();
// 主线程Handler
Handler mainHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
String data = (String) msg.obj;
textView.setText(data);
break;
}
}
};
2、AsyncTask(该方式已标记为已废弃)
Kotlin
object : AsyncTask<Void, Void, String>() {
override fun doInBackground(vararg params: Void): String {
return "计算结果" // 在子线程执行
}
override fun onPostExecute(result: String) {
textView.text = result // 在主线程执行
}
}.execute()
3、BlockingQueue(阻塞队列)实现生产者-消费者
java
val queue = LinkedBlockingQueue<String>()
// 生产者线程
thread {
queue.put("数据1")
}
// 消费者线程
thread {
val data = queue.take() // 阻塞获取
println(data)
}
4、Executor框架 + Activity.runOnUiThread
java
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.execute(() -> {
// 后台工作
final String result = doWork();
// 返回主线程
runOnUiThread(() -> {
textView.setText(result);
});
});
5、RxJava
6、EventBus
7、Kotlin协程
Kotlin
// 在ViewModel或LifecycleOwner中
lifecycleScope.launch {
// 主线程执行
val deferred = async(Dispatchers.IO) {
// IO线程执行耗时操作
fetchDataFromNetwork()
}
// 自动切换回主线程
val result = deferred.await()
updateUI(result)
}
8、LiveData
java
// ViewModel中
MutableLiveData<String> data = new MutableLiveData<>();
// 观察者
data.observe(this, new Observer<String>() {
@Override
public void onChanged(String value) {
// UI线程自动更新
textView.setText(value);
}
});
// 工作线程更新
String result = fetchData();
data.postValue(result); // 非UI线程使用postValue
进程间通信的方式:
1、AIDL
2、Binder机制
3、ContentProvider
4、Service
5、广播(Broadcast)
6、Intent
7、Socket
二、Binder机制
https://blog.csdn.net/qq_34707150/article/details/148492748?spm=1011.2415.3001.5331