Краткое описание проблемы
У меня есть приложение, которое сочетает в себе Java и Python, два языка, взаимодействующие через сокет localhost. (Я не могу использовать Jython, я не могу выбросить Java для PyGame и не могу выбросить Python для чистой Java.)
Приложение открывает сокет между Python и Java и сокет от Java до центрального сервера. Ввод в Java из пользовательского интерфейса или с сервера передается на Python, где заботится о логике программы. Затем Python отправляет обратно сообщения в Java, которые либо передаются на сервер, либо интерпретируются для использования на клиенте (например, Python говорит Java рисовать что-то на экране).
Фрагменты кода
Client.java: главный
PyConnect python = new PyConnect();
Thread th = new Thread(python);
th.start();
while(!python.isInitialized());
Client game = new Client();
PythonMessageDecoder.setGame(game);
th = new Thread(game);
th.start();
PyConnect.java: бег
System.out.println("Starting...");
// ...Initialize ServerSocket instance to Python...
try
{
// ...Accept connection from Python...
System.out.println("Connected!!!");
}
// ...catch...
try
{
// ...Get input/output streams...
System.out.println("Both Streams are up");
}
// ...catch...
initialized = true;
while(PythonMessageDecoder.getInstance() == null);
// ...Read from Python...
PythonMessageDecoder.java
public static void setGame(Game game) { PythonMessageDecoder.game = game; }
public static PythonMessageDecoder getInstance()
{
if(game == null) return null;
return InstanceHolder.INSTANCE;
}
// ...
Сведения о проблеме
На всех наших компьютерах с Windows (XP, Vista и W7; x86 и x64) этот процесс работает нормально. На наших машинах с Ubuntu и OSX нет исключений (в Python или Java) ... но фрейм Java не появляется. В приведенных выше примерах я оставил в трассировке отладку, и на окнах Mac и Linux выведите:
Starting ...
Connected !!!
Оба потока работают
Кроме того, другие части Java нашего проекта (которые не пытаются объединяться с Python) работают отлично. Оболочка Python работает нормально. Код Python работает просто отлично (если Python не подключился, PyConnect
не достиг бы строки «Подключено !!!»).
Попытки решения
Сначала я подумал, что проблема могла быть в тупике между двумя потоками, так как они оба перестают ждать условия, прежде чем завершить свою задачу. Но PyConnect
устанавливает свое состояние initialized
перед ожиданием, и основной поток проверяет, что PyConnect
достиг своего состояния initialized
. Если честно, я не уверен, в чем проблема.