Android NDK(八):JNI多线程

来源:互联网 发布:cassandra数据库下载 编辑:程序博客网 时间:2024/06/03 21:34

今天来唠唠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中多线程的介绍就是这些,内容比较浅,但是基本涵盖了要用的方式,还希望大家在实践当中去深刻体会。

0 0
原创粉丝点击