今天来唠唠JNI中关于多线程。多线程,即多个线程同时工作,多线程的问题比较复杂,在实际情况下可能会面临众多的问题。JNI中也提供了一系列函数帮助我们完成多线程交互。博客内容大致分为如下:

 1. 同步代码块

 2. 等待唤醒

本篇内容可能介绍的比较浅显,更多的东西还需要大家再实战中去慢慢体会。

一、同步代码块

如果本地代码要运行在多个线程环境中,可能会面临同时共享资源的情况。这种情况下,为了避免资源占有问题,需要我们进行同步处理。

Java中,JDK为我们提供了synchronized来处理多线程同步代码块。


    synchronized (Obj.class) {
        // 业务处理
    }

本地代码中,JNI提供了两个函数来完成上面的同步:

(1)MonitorEnter:进入同步代码块

(2)MonitorExit:退出同步代码块

 

  上述代码,程序必须先进入obj的监视器,再执行同步代码块中的代码。如果另一个线程已经进入了与这个obj监视器的话,当前线程会阻塞。

  如果当前线程在不拥有监视器即没有调用MonitorEnter的情况下,调用MonitorExit,系统会产生一个错误,并抛出异常。所以两个方法必须成对出现。

  同样在上述代码中,我们看到了对两个函数的错误检查,因为有可能会执行失败,比如创建监视器时,资源分配不成功等原因。同样,在代码发生异常时,记得调用MonitorExit方法退出同步代码块:

 

我们可以发现在本地代码中处理同步代码块要比java中复杂的多,所以,尽量用Java来做同步吧,把与同步相关的代码都移到Java中去。

二、等待唤醒

Java中提供了Object.wait、Object.notify和Object.notifyAll来执行多线程的交互操作。但是在JNI中却没有提供与之对应的函数。不过我们可以通过JNI调用Java中的这些函数。

 

上面代码中,假设我们已经缓存了方法的ID。定义了三个对应的方法来调用Jvm中的wait,notify,notifyAll函数即可。

关于JNI中多线程的介绍就是这些,内容比较浅,但是基本涵盖了要用的方式,还希望大家在实践当中去深刻体会。

更多相关文章

  1. Android通过多点触控的方式对图片进行缩放的实例代码
  2. Android(安卓)NDK的C/C++代码中利用JNI回调实现字符编码转换
  3. Android(安卓)NDK编译本地文件以及引用第三方so文件
  4. Android(安卓)Studio如何查看资源或者函数在哪些类中被引用
  5. 如何在Android中使用汇编语言
  6. android 逆向工程
  7. 【Android游戏开发二十五】在Android上的使用《贝赛尔曲线》!
  8. Android中怎么破解游戏之修改金币数
  9. ANDROID Bionic C DOCS

随机推荐

  1. mtk android meta连接
  2. 疯狂Android讲义第三版完整带目录
  3. Android串口编程 8.1 Rk3288
  4. android 6.0 logcat机制(三)logd处理请求lo
  5. Android开发学习系列(一)——Android按钮圆
  6. Capacitor+Vue+Vant移动端打包总结
  7. Android使用控件ImageView加载图片的方法
  8. Android Studio Gradle自动打包文档
  9. Android中Service服务详解(一)
  10. Android 滑动效果进阶篇(六)—— 倒影效果