Java 如果使用jacejni进行多线程本机调用,Tomcat将崩溃
我使用NETBeas构建一个java C++项目(基于Tomcat 6.02),它加载C++原生DLL。我正在使用包装JNI的Java 如果使用jacejni进行多线程本机调用,Tomcat将崩溃,java,tomcat,java-native-interface,boost-thread,Java,Tomcat,Java Native Interface,Boost Thread,我使用NETBeas构建一个java C++项目(基于Tomcat 6.02),它加载C++原生DLL。我正在使用包装JNI的Jace库 在java代码中,我有一个静态回调函数,我从C++代码中调用它。我正试图使用boost.thread在一个新线程中调用此回调,但tomcat在调用时没有任何消息或崩溃报告。但是,如果我直接调用该函数,它可以正常工作 你能告诉我可能出了什么问题吗 下面是导致崩溃的C++代码: 以下是我的java代码: 编辑: 奇怪的是,下面的代码也可以工作。也就是说,如果我调用
Jace
库
在java代码中,我有一个静态回调函数,我从C++代码中调用它。我正试图使用boost.thread在一个新线程中调用此回调,但tomcat在调用时没有任何消息或崩溃报告。但是,如果我直接调用该函数,它可以正常工作
你能告诉我可能出了什么问题吗
下面是导致崩溃的C++代码:
以下是我的java代码:
编辑:
奇怪的是,下面的代码也可以工作。也就是说,如果我调用一次functor,然后创建多个线程,就不会发生崩溃。而且,这种崩溃只发生在Tomcat中,如果我创建一个独立的java应用程序,则不会发生。谁能解释一下为什么会这样
MyFunctor func1;
func1();
for (int i = 0; i < 10; ++i)
{
MyFunctor func;
boost::thread t(func);
}
MyFunctor func1;
func1();
对于(int i=0;i<10;++i)
{
MyFunctor func;
boost::线程t(func);
}
在崩溃的情况下:
在for循环中创建func
。然后使用func
启动一个线程。
在for循环结束时,func
和thread
将被销毁。谁知道当你在线程想要访问它的时候触发线程并销毁它的函子会发生什么呢
您还将从另一个本机线程调用java代码,而不是在中调用java代码,这听起来像是在崩溃的情况下执行的非常不安全的操作: 在for循环中创建
func
。然后使用func
启动一个线程。
在for循环结束时,func
和thread
将被销毁。谁知道当你在线程想要访问它的时候触发线程并销毁它的函子会发生什么呢
您还将从另一个本机线程调用java代码,而不是在其中调用java代码,这听起来是一件非常不安全的事情听起来您很幸运,第二种情况没有崩溃。仅仅因为它没有崩溃并不意味着它是对的。听起来你很幸运,第二个案例没有崩溃。仅仅因为它没有崩溃并不意味着它是正确的。重新标记为boost线程以与其他boost库保持一致。重新标记为boost线程以与其他boost库保持一致。
//from native method:
for (int i = 0; i < 10; ++i)
{
MyFunctor func;
func();
}
class MyFunctor
{
public:
void operator ()() const
{
ArrayList orders, trades;
//...Fill the above ArrayLists;
jace::proxy::test::CallBackTest::callbackFunc(orders, trades);
}
}
public class CallBackTest {
public static void callbackFunc(ArrayList arraylist, ArrayList arraylist1) {
//System.out.println(); the two arraylists;
}
}
MyFunctor func1;
func1();
for (int i = 0; i < 10; ++i)
{
MyFunctor func;
boost::thread t(func);
}