主线程和子线程的通讯之主线程用bundle发送数据到子线程

package com.wangcan;

import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

System.out.println("当前线程的id是:"+Thread.currentThread().getId());
System.out.println("当前线程的名称是:"+Thread.currentThread().getName());

HandlerThread htThread=new HandlerThread("myht");
htThread.start();
Handler mHandler=new Handler(htThread.getLooper()){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
//super.handleMessage(msg);
Bundle b2= msg.getData();
int age= b2.getInt("age");
String name = b2.getString("name");
Log.d("TAG", "age:" + age + ", name:" + name);
Log.d("TAG", "handler-->" + Thread.currentThread().getId());
Log.d("TAG", "handleMessage");
}
};
Message msg = mHandler.obtainMessage();
//将msg发送到目标对象,就是生成该msg的Handler对象

Bundle b = new Bundle();//使用Bundle来传递数据
b.putInt("age", 20);
b.putString("name", "John");
msg.setData(b);
msg.sendToTarget();

}



@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}

<think>嗯,用户想了解主线程子线程之间的关系以及它们如何交互。首先,我需要回忆一下操作系统并发编程的基础知识。主线程通常是程序启动时自动创建的线程,负责执行主要的任务,比如UI更新。子线程则是主线程创建的,用来处理耗时操作,避免阻塞主线程。 接下来,交互机制。记得不同的编程框架有不同的方法。比如在Android里用HandlerMessageQueue,Java中可以用wait/notify,或者Qt的信号槽。需要结合用户提供的引用资料,特别是他们提到的几个引用,比如引用1到5,里面提到了Handler、消息队列、信号槽等。 然后,用户可能想知道具体的交互方式,比如数据传递、同步机制。需要分点说明关系,再讲交互方式,比如消息传递、共享内存、回调函数。同时要注意线程安全的问题,比如如何避免竞态条件,使用锁或者同步块。 还要考虑用户的实际应用场景,比如Android开发中主线程更新UI,子线程处理网络请求,这时候如何通过Handler发送消息到主线程。或者Qt中通过元对象系统注册自定义类型,用信号槽传递数据。 可能用户是开发者,遇到多线程通信的问题,需要具体的实现方法。所以回答中要给出例子,比如代码片段,说明如何使用Handler,或者信号槽。同时引用提供的资料,比如引用1中的Handler实现双向通信,引用5中Qt的数据传递方法。 另外,用户的问题可能涉及到底层机制,比如消息队列的工作原理,或者事件循环。需要简明扼要地解释这些概念,但不要过于深入,保持回答的实用性。 最后,确保回答结构清晰,分点列出关系交互机制,然后给出不同平台的实现方式,并附上相关问题,帮助用户进一步学习。需要检查引用是否正确对应,比如引用1对应Android的Handler,引用5对应Qt的数据传递。</think>### 主线程子线程的关系及交互机制 #### 一、主线程子线程的关系 1. **层级关系** 主线程是程序启动时自动创建的核心线程,负责执行入口函数(如 `main()` 函数)。子线程主线程显式或隐式创建,用于分担耗时任务(如网络请求、复杂计算)[^2][^4]。 2. **资源分配** 主线程子线程共享进程内存空间(如堆、全局变量),但各自拥有独立的栈空间程序计数器。 3. **生命周期** 主线程的结束通常意味着进程终止,而子线程的生命周期由其任务决定。主线程需管理子线程的创建销毁[^3]。 4. **职责差异** - 主线程:负责UI渲染、事件响应等实时性要求高的任务。 - 子线程:处理后台任务,避免阻塞主线程[^1][^4]。 --- #### 二、线程间交互机制 1. **消息队列(Message Queue)** - **实现方式**:通过 `Handler` 向主线程的消息队列发送消息(如Android平台)[^4]。 - **代码示例**(Android): ```java // 主线程中创建Handler Handler handler = new Handler(Looper.getMainLooper()) { @Override public void handleMessage(Message msg) { // 处理子线程发送的消息 } }; // 子线程发送消息 new Thread(() -> { Message message = handler.obtainMessage(); message.obj = "数据"; handler.sendMessage(message); }).start(); ``` 2. **共享内存与同步** - 使用 `synchronized` 或 `volatile` 保证数据可见性。 - 需避免竞态条件,例如通过锁机制控制对共享资源的访问。 3. **回调函数(Callback)** 子线程完成任务后,通过接口回调通知主线程: ```java // 定义回调接口 interface OnResultListener { void onSuccess(String data); } // 子线程触发回调 new Thread(() -> { String result = doBackgroundTask(); runOnUiThread(() -> listener.onSuccess(result)); // 切换到主线程执行 }).start(); ``` 4. **事件总线/信号槽(如Qt)** - Qt中使用信号槽机制跨线程传递数据: ```cpp // 子线程定义信号 class Worker : public QObject { Q_OBJECT signals: void dataReady(QVariant data); }; // 主线程连接信号与槽 QThread thread; Worker worker; worker.moveToThread(&thread); connect(&worker, &Worker::dataReady, this, &MainWindow::updateUI); ``` --- #### 三、不同平台的实现对比 | **机制** | **Android** | **Java** | **Qt** | |----------------|----------------------|----------------------|----------------------| | **消息传递** | Handler/Looper | Executor/Future | Signal/Slot | | **数据封装** | Message/Bundle | 共享对象+同步 | QMetaType注册类型[^5]| | **线程切换** | runOnUiThread() | SwingUtilities.invokeLater() | QMetaObject::invokeMethod() | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值