当前位置: 首页 > wzjs >正文

工信部查询网站备案南通百度seo代理

工信部查询网站备案,南通百度seo代理,wordpress 浏览量,中铁建设集团门户网登录不上去1. 主线程(Main Thread / UI Thread)特点唯一性:每个 Android 进程只有一个主线程。职责:处理 UI 渲染(如 View 绘制、触摸事件)执行 Activity/Fragment 生命周期回调限制:不能执行耗时操作&…

1. 主线程(Main Thread / UI Thread)

特点

  • 唯一性:每个 Android 进程只有一个主线程。

  • 职责

    • 处理 UI 渲染(如 View 绘制、触摸事件)

    • 执行 Activity/Fragment 生命周期回调

  • 限制

    • 不能执行耗时操作(如网络请求、文件读写),否则会导致 ANR(Application Not Responding)。

    • 所有 UI 操作(如 TextView.setText())必须运行在主线程。

代码示例

// 在主线程更新 UI
textView.text = "Hello, UI Thread!"

2. 子线程(Java 子线程)

特点

  • 由 JVM 管理:通过 Java 的 ThreadExecutorService 或 Kotlin 协程创建。

  • 典型用途

    • 网络请求(Retrofit、OkHttp)

    • 数据库操作(Room)

    • 文件 I/O

  • 与主线程通信

    • 通过 HandlerLiveData 或 runOnUiThread 切换回主线程更新 UI。

代码示例

// 方式1:使用 Thread
Thread {// 在子线程执行耗时任务val result = fetchDataFromNetwork()runOnUiThread { // 切回主线程更新 UItextView.text = result}
}.start()// 方式2:使用协程(推荐)
lifecycleScope.launch(Dispatchers.IO) {val result = fetchDataFromNetwork()withContext(Dispatchers.Main) { // 切回主线程textView.text = result}
}

3. 本地线程(Native Thread)

特点

  • 由 C/C++ 创建:通过 std::thread 或 pthread 实现,运行在 Native 层(不受 JVM 直接管理)。

  • 典型用途

    • 高性能计算(如音视频编解码、图像处理)

    • 调用底层硬件(如 OpenGL、传感器)

  • 与 Java 交互

    • 必须手动附加到 JVM(AttachCurrentThread)才能调用 Java 方法。

    • 线程结束时需分离(DetachCurrentThread),否则可能内存泄漏。

代码示例

// Native 层代码(C++)
#include <jni.h>
#include <thread>JavaVM* g_jvm; // 全局保存 JVM 引用void nativeThreadTask(JNIEnv* env, jobject callback) {// 1. 执行耗时计算int result = heavyComputation();// 2. 回调 Java 方法jclass clazz = env->GetObjectClass(callback);jmethodID method = env->GetMethodID(clazz, "onResult", "(I)V");env->CallVoidMethod(callback, method, result);
}void startNativeThread(JNIEnv* env, jobject callback) {std::thread([callback] {// 1. 附加当前线程到 JVMJNIEnv* env;g_jvm->AttachCurrentThread(&env, nullptr);// 2. 执行任务nativeThreadTask(env, callback);// 3. 分离线程g_jvm->DetachCurrentThread();}).detach(); // 让线程独立运行
}

三者的核心区别

特性主线程子线程(Java)本地线程(Native)
创建方式Android 系统自动创建Thread/Coroutinestd::thread/pthread
运行环境JVM 管理的 UI 线程JVM 管理的线程池操作系统直接调度的线程
能否操作 UI✅ 能❌ 不能(需切回主线程)❌ 不能(需 JNI 回调主线程)
耗时操作支持❌ 禁止(会 ANR)✅ 适合✅ 适合(性能更高)
与 Java 交互直接调用直接调用需手动附加/分离 JVM

如何选择线程模型?

  1. 需要更新 UI? → 用主线程。

  2. 需要执行 I/O 或网络请求? → 用 Java 子线程或协程。

  3. 需要高性能计算(如 FFmpeg、OpenCV)? → 用本地线程 + JNI。

  4. 需要跨线程通信? → 主线程和子线程用 Handler,本地线程用 JNI Callback


常见问题

Q1:本地线程不附加 JVM 会怎样?

  • 调用 JNI 方法会崩溃(JNIEnv* 无效)。

  • 必须通过 AttachCurrentThread 获取有效的 JNIEnv

Q2:主线程为什么不能阻塞?

  • Android 要求主线程在 5 秒内 响应输入事件,否则触发 ANR。

Q3:协程是子线程吗?

  • 协程是轻量级线程管理工具,底层仍运行在 JVM 线程池上,属于 逻辑上的子线程


总结

  • 主线程:唯一,管 UI,不能阻塞。

  • 子线程:Java 层多任务,适合 I/O。

  • 本地线程:C++ 层高性能计算,需手动管理 JNI 环境。

1. 本地线程可以创建多个吗?

✅ 可以无限创建(理论)
本地线程是通过 C/C++ 的 std::thread 或 pthread 直接调用操作系统 API 创建的,不受 JVM 管理,因此:

  • 没有硬性数量限制(不像 Java 线程受线程池约束)。

  • 实际能创建的线程数取决于 设备资源(CPU 核心数、内存等)。

⚠️ 但需谨慎
创建过多本地线程会导致:

  • 内存耗尽(每个线程默认占用 1~2MB 栈内存)

  • CPU 频繁切换线程,性能下降

  • 增加 JNI 环境管理的复杂度


2. 本地线程 vs Java 子线程的数量对比

线程类型数量限制管理方式
Java 子线程受线程池配置限制(默认约 20)由 JVM 统一管理
本地线程(Native)仅受系统资源限制需开发者手动管理

3. 如何正确创建多个本地线程?

示例代码(C++11)
#include <thread>
#include <vector>JavaVM* g_jvm; // 全局保存 JVMvoid nativeWorkerTask(JNIEnv* env, int threadId) {// 1. 执行任务(如计算)// 2. 可通过 env 回调 Java
}void startMultipleThreads(JNIEnv* env, int threadCount) {std::vector<std::thread> threads;for (int i = 0; i < threadCount; i++) {threads.emplace_back([i] {// 附加当前线程到 JVMJNIEnv* env;g_jvm->AttachCurrentThread(&env, nullptr);// 执行任务nativeWorkerTask(env, i);// 分离线程g_jvm->DetachCurrentThread();});}// 让线程独立运行(不阻塞当前线程)for (auto& t : threads) {t.detach();}
}
关键注意事项
  1. JNI 环境管理

    • 每个本地线程必须 单独调用 AttachCurrentThread 获取 JNIEnv

    • 线程退出前必须 DetachCurrentThread,否则内存泄漏。

  2. 资源控制
    建议使用 线程池模式(如 C++ 的 std::async 或第三方库)。

  3. 线程安全

    • 共享数据需加锁(如 std::mutex)。

    • 避免在回调 Java 时持有锁,可能引发死锁。


4. 实际应用场景

适合多本地线程的情况
  • 音视频编解码(FFmpeg)

  • 并行图像处理(OpenCV)

  • 物理仿真计算

不适合的情况
  • 简单异步任务(用 Java 线程或协程更高效)

  • 需要频繁与 UI 交互的任务(应通过主线程 Handler 转发)


5. 性能优化建议

  1. 限制线程数量

    // 根据 CPU 核心数动态控制
    unsigned int maxThreads = std::thread::hardware_concurrency();
  2. 使用线程池

    #include <future>
    std::vector<std::future<void>> futures;
    futures.push_back(std::async(std::launch::async, []{// 任务代码
    }));
  3. 监控资源占用

    • 通过 /proc/self/status 查看线程数(Linux 系统)

    • 使用 Android Profiler 检测内存和 CPU 使用率


总结

  • 可以创建多个本地线程,但需手动管理生命周期和 JNI 环境。

  • 优先使用线程池,避免无限制创建线程。

  • 简单任务用 Java 线程,复杂计算再用本地线程。

http://www.dtcms.com/wzjs/519365.html

相关文章:

  • seo新手入门教程seo基础教程使用
  • 诸城哪里有做网站的鱼头seo软件
  • 网站开发讲座谷歌seo排名工具
  • 做生鲜食品最好的网站保定关键词排名推广
  • 2014做网站实体店怎么引流推广
  • 西安膜结构seo的工作内容主要包括
  • 河北省最新任免seo优化信
  • 如何做餐饮的网站最新网络推广平台
  • 网站备案 厦门百度关键词
  • 那个网站做logo兼职数据分析师培训
  • 摄影网站建设论文百度服务商平台
  • 荆门网站建设淘宝店铺转让价格表
  • 中企做网站品牌推广渠道
  • wordpress 手机不显示图片win10系统优化工具
  • 番禺做网站公司a站
  • 软件开发文档写作小时seo加盟
  • 建设工程管理条例搜狗搜索排名优化
  • 模版网站建设企业关于友情链接的作用有
  • wordpress循环调用最新文章seo教程百度网盘
  • 郑州哪里做网站最好营销方式和渠道有哪些
  • 济南网站建站推广杭州排名优化软件
  • 现在主流的web框架北京seo优化外包
  • 站外推广网站平台优化是什么意思
  • 北仑做网站唐老鸭微信营销软件
  • 浙江网站建设推广公司找哪家链接搜索
  • 昆山市建设工程交易中心网站企业培训网
  • 四川网站建设咨询怎么制作网站链接
  • 门户网站建设教程google推广技巧
  • 造纸公司网站建设站长工具app
  • 杭州做公司网站的公司武汉网站制作