Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> запаузить ветвь потоков 
V
    Опции темы
leniviy
Дата 28.3.2011, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: нет
Всего: 5



Привет. Есть junit для некоего клиента. В методе setUp() стартует embedded server. В нескольких тестах надо протестировать таймауты. Сервер многопоточный, исходников нет. Я хочу запаузить все треды сервера. 
Для этого я планирую создать родительский тред и стартануть из него сервер, а в нужный момент перечислить все потомки этого треда и остановить их. Как это сделать?

Дочерние потоки ведь не обязательно наследуют ThreadGroup или ClassLoader?

Это сообщение отредактировал(а) leniviy - 28.3.2011, 19:22
PM MAIL   Вверх
AntonSaburov
Дата 29.3.2011, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



Может проще не выходить из setUp пока сервер не стартует. А признаком, что стартовал может служить ответ сервера на какой-то запрос к нему. Пока ответов нет - значит ждем.
PM MAIL WWW ICQ   Вверх
leniviy
Дата 29.3.2011, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: нет
Всего: 5



Сорри, но ответ невпопад.
Я решил стартовать сервер в отдельном процессе, тогда можно суспендить все треды кроме main. Вероятность дедлока будет меньше.
Появилась проблема с наследованием classpath. Хотел использовать SurefireBooter из maven, но нет времени разбираться. Так-что по-простому:
Код

    public static Process exec(String mainclass, String[] args) throws IOException {
        String[] cmdarray = new String[4 + args.length];
        cmdarray[0] = "java";
        cmdarray[1] = "-classpath";
        cmdarray[2] = System.getProperty("java.class.path");
        cmdarray[3] = mainclass;
        for (int i = 0; i < args.length; i++) {
            cmdarray[4+i] = args[i];
        }
        final Process p = Runtime.getRuntime().exec(cmdarray);
        return p;
    }

Вероятная проблема: 2 инстанса log4j пишут в 1 файл

а так я останавливаю потоки
Код

    public static void suspendOtherThreads() throws InterruptedException {
        Thread currentThread = Thread.currentThread();
        Thread[] tarray1 = threadsById();
        aaa: while (true) {
            for (int i = 0 ; i < tarray1.length; i++) {
                if (currentThread == tarray1[i]) continue;
                tarray1[i].suspend();
            }
            Thread.sleep(100); // let 'em start
            Thread[] tarray2 = threadsById();
            if (tarray2.length == tarray1.length) {
                int i;
                for (i = 0 ; i < tarray1.length; i++) {
                    if (tarray2[i] != tarray1[i]) break;
                }
                if (i == tarray1.length) break aaa;
            }
            tarray1 = tarray2;
            //System.out.println("differ");
        } 
    }

    public static void resumeOtherThreads() {
        Thread currentThread = Thread.currentThread();
        Thread[] tarray1 = threadsById();
        for (int i = 0 ; i < tarray1.length; i++) {
            if (currentThread == tarray1[i]) continue;
            tarray1[i].resume();
        }
    }

    private static Thread[] threadsById() {
        int count;
        Thread[] tarray;
        Thread currentThread = Thread.currentThread(); 
        do {
            tarray = new Thread[Thread.activeCount()*2];
            count = Thread.enumerate(tarray);
        } while (count >= tarray.length);
        Thread[] rslt = new Thread[count];
        for (int i = 0; i < count; i++)
            rslt[i] = tarray[i];
        Arrays.sort(rslt, new Comparator<Thread>() {
            public int compare(Thread o1, Thread o2) {
                if (o1 == o2)
                    return 0;
                if (o1 == null)
                    return -1;
                if (o2 == null)
                    return 1;
                return o1.getId() < o2.getId() ? -1 : 1;
            }
        });
        return rslt;
    }


Это сообщение отредактировал(а) leniviy - 29.3.2011, 15:34
PM MAIL   Вверх
AntonSaburov
Дата 29.3.2011, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



Цитата(leniviy @  29.3.2011,  15:33 Найти цитируемый пост)
Сорри, но ответ невпопад.

Если честно - не понял я тогда вопрос. Если сервер embedded, то это обычно в той же JVM. Или тогда вопрос задан без точного описания проблемы.
Если сервер - внешний процесс, то тем более не проще ли задать вопрос серверу и получить ответ, что он еще не готов (или готов). И решать вопрос о запуске тестов. Такой огород городить с запуском/остановкой тредов - как-то сложно выглядит.

PM MAIL WWW ICQ   Вверх
leniviy
Дата 29.3.2011, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: нет
Всего: 5



> И решать вопрос о запуске тестов.
Проблема не в этом. Мне надо, чтобы сервер как бы "завис" во время теста.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0446 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.