Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > запаузить ветвь потоков


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

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

Автор: AntonSaburov 29.3.2011, 15:13
Может проще не выходить из setUp пока сервер не стартует. А признаком, что стартовал может служить ответ сервера на какой-то запрос к нему. Пока ответов нет - значит ждем.

Автор: leniviy 29.3.2011, 15:33
Сорри, но ответ невпопад.
Я решил стартовать сервер в отдельном процессе, тогда можно суспендить все треды кроме 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;
    }

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)