单个 java 线程如何一次执行多个本机方法?

Posted

技术标签:

【中文标题】单个 java 线程如何一次执行多个本机方法?【英文标题】:How can a single java thread execute more than one native method at a time? 【发布时间】:2013-10-24 13:30:47 【问题描述】:

我正在尝试查找我的 android 应用程序中的问题。此问题会导致在代码的本机层进行垃圾收集期间崩溃。我自己解释一下。

我的应用程序仅包含 Java 源代码控制 GUI 元素等,以及一个管理渲染和应用程序其他性能关键部分的本机库。它具有用于渲染的 GLSurfaceView。

java 层需要能够访问和实例化原生对象,因此这些通过 Swig 暴露给 Java。 Swig 所做的是,在每个包装类(在 Java 中)中,它会生成一个 finalize 方法,该方法将调用本机删除运算符。

考虑以下伪代码:

在 C++ 中:

class MyClass 

    public:

        MyClass () 

        ~MyClass ()
        
            print("deleting MyClass instance");
            print("doing 1");
            do1();
            print("doing 2");
            do2();
            print("doing 3");
            do3();
            print("instance deleted");
        
;

这是伪代码,例如“print”代表 android logcat 中的打印,我只是保持简单愚蠢;)。

让我感到困惑的是,当垃圾收集器运行并在某些情况下调用析构函数时,我会发现输出在多个析构函数之间交错(就好像它们被同时删除一样)。在本例中,它可能是:

deleting MyClass instance
doing 1
deleting MyClass instance
doing2
doing1
doing2
deleting MyClass instance
doing3
doing3
instance deleted
doing1
doing2
instance deleted
doing3
instance deleted

同时 logcat 明确指出这些消息来自同一个线程(终结器线程)。

因此我的问题是:“单个线程如何同时执行多个本机调用?”

【问题讨论】:

见***.com/questions/11052064/jvm-garbage-collection @Samhain 在这里不适用,因为这发生在 Dalvik VM 中,而不是 JVM 谢谢@TassosBassoukos,我也认为链接的问题在这里没有解释问题。 【参考方案1】:

本机析构函数是否回调到 VM 中?

【讨论】:

以上是关于单个 java 线程如何一次执行多个本机方法?的主要内容,如果未能解决你的问题,请参考以下文章

java多线程知识汇总如何选择锁?如何加锁

写出java多线程程序设计中常用类及方法名,并分别说明它们的作用。

如何合并每个线程结果 - java

java中怎么用socket 一次传多个文件啊?

java线程如何一分钟执行一次

将不受信任的java代码限制为单个线程[重复]