J'utilise NetBeans pour construire un projet web java (basé sur tomcat 6.02) qui charge une DLL native C++. J'utilise la bibliothèque Jace
qui enveloppe JNI.Tomcat se bloque si effectuer un appel natif multithread en utilisant Jace JNI
Dans mon code java, j'ai une fonction de rappel statique que j'appelle du code C++. J'essaye d'invoquer ce callback dans un nouveau thread en utilisant boost.Thread mais tomcat meurt juste sans message ou rapport d'erreur quand je le fais. Cependant, si j'appelle directement la fonction, cela fonctionne très bien.
Pouvez-vous suggérer ce qui pourrait ne pas être?
ci-dessous est mon C++ code qui provoque l'accident:
//from native method:
for (int i = 0; i < 10; ++i)
{
MyFunctor func;
boost::thread t(func);
}
ci-dessous est mon C++ code qui fonctionne très bien:
//from native method:
for (int i = 0; i < 10; ++i)
{
MyFunctor func;
func();
}
classe Functor (ce qui provoque l'accident):
class MyFunctor
{
public:
void operator()() const
{
ArrayList orders, trades;
//...Fill the above ArrayLists;
jace::proxy::test::CallBackTest::callbackFunc(orders, trades);
}
}
est mon code java:
public class CallBackTest {
public static void callbackFunc(ArrayList arraylist, ArrayList arraylist1) {
//System.out.println(); the two arraylists;
}
}
EDIT:
Étrangement, le code suivant fonctionne également. C'est-à-dire que si j'appelle le foncteur une seule fois puis que je crée plusieurs threads, il n'y a pas de plantage. Aussi cet accident se produit uniquement dans Tomcat et pas si je fais une application Java autonome. Quelqu'un peut-il expliquer pourquoi cela arrive?
MyFunctor func1;
func1();
for (int i = 0; i < 10; ++i)
{
MyFunctor func;
boost::thread t(func);
}
retagged pour stimuler-fil pour être compatible avec d'autres boost bibliothèques. – rcollyer