Java <-> поток локального хоста Python, Java не продолжается - PullRequest
1 голос
/ 24 июля 2010

Краткое описание проблемы

У меня есть приложение, которое сочетает в себе 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. Если честно, я не уверен, в чем проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...