Java получить поток, созданный с помощью вызова main - PullRequest
1 голос
/ 15 сентября 2010

У меня есть клиент-серверное приложение, и для целей тестирования мне нужно запустить клиент в тестовом методе, вызвав

Client.main();

, который создает новый поток.Теперь мне нужно дождаться завершения этого потока, прежде чем выполнять утверждения в моем тесте.Как я узнаю, когда это произойдет?В качестве альтернативы, как мне узнать, какой поток был запущен вызовом (клиент может создавать и другие потоки).

Ответы [ 3 ]

6 голосов
/ 15 сентября 2010

Программный вызов main сам по себе не создаст новый поток. Это произойдет, только если у метода main есть код для явного запуска нового потока. Если это так, вы должны изменить Client, чтобы предоставить доступ к этому потоку в какой-либо форме, чтобы вы могли вызвать join() для него. (Вызов Thread.join() - это стандартный способ ожидания завершения потока.)

Выполняет ли Client.main() какие-либо задачи , отличные , кроме создания нового потока? Если нет, то для ваших тестов, вероятно, будет проще просто вызвать любой метод run(), в котором будет работать новый поток, и сделать тест однопоточным, насколько это возможно.

0 голосов
/ 15 сентября 2010

Никогда не пробовал, но может работать в вашем особом случае. Thread имеет статический метод для получения трассировки стека для всех активных потоков, и с помощью этого метода вы получаете набор объектов потоков. Вызов его до и после вызова main должен позволить вам получить ссылки на все потоки, которые были созданы / запущены во время выполнения основного метода:

 Set<Thread> before = Thread.getAllStackTraces().keySet();
 Client.main();
 Set<Thread> after = Thread.getAllStackTraces().keySet();

Конечно, идентифицировать ваши нити еще проще (и более надежно), если ваши потоки создаются с уникальными идентификаторами / именами. Теперь вы можете рассчитать разницу и вызвать объединение во всех этих потоках. может иметь побочные эффекты, но, как упоминалось выше, может помочь в вашем конкретном тестовом примере.

0 голосов
/ 15 сентября 2010

Вы можете использовать join() для ожидания завершения выполнения другим потоком.

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