Тест журнала многопоточных


Я письменные расширение логгер, который позволяет нескольким потокам войти в процесс, а потом сваливают, что войти в главный вход в одной атомарной операции. Суть ее в том, чтобы сделать журналы удобнее читать, когда много потоков выполнения. Этот тест действителен и понятно?

/**
 * Test that thread logs do not interlace
 * @throws InterruptedException 
 */
@Test
public void testDumpMultithreaded() throws InterruptedException {
    Thread t1 = new Thread() {
        @Override
        public void run() {
            logger.bufferedMessages.get().add("t1: One");
            logger.bufferedMessages.get().add("t1: Two");
            logger.bufferedMessages.get().add("t1: Three");
            logger.dump();
        }
    };

    Thread t2 = new Thread() {
        @Override
        public void run() {
            logger.bufferedMessages.get().add("t2: One");
            logger.bufferedMessages.get().add("t2: Two");
            logger.bufferedMessages.get().add("t2: Three");
            logger.dump();
        }
    };

    t1.start();
    t2.start();

    t1.join();
    t2.join();

    Iterator<String> i = logger.messages.iterator();
    boolean t1Correct = false;
    boolean t2Correct = false;

    while (i.hasNext()) {
        if (i.next().equals("t1: One")) {
            t1Correct = true;
            t2Correct &= i.next().equals("t1: Two");
            t2Correct &= i.next().equals("t1: Three");
        }
    }

    i = logger.messages.iterator();
    while (i.hasNext()) {
        if (i.next().equals("t2: One")) {
            t2Correct = true;
            t2Correct &= i.next().equals("t2: Two");
            t2Correct &= i.next().equals("t2: Three");
        }
    }

    assertEquals("Thread one's log not consecutive: ", true, t1Correct);
    assertEquals("Thread two's log not consecutive: ", true, t2Correct);
}


1168
7
задан 3 февраля 2011 в 08:02 Источник Поделиться
Комментарии
2 ответа

Барьер может обеспечить потоки выполняются в расслоенной моды.

final CyclicBarrier rendezvous = new CyclicBarrier(2);
final CyclicBarrier conclusion = new CyclicBarrier(3);
Thread a = new Thread() {
public void run() {
try {
rendezvous.await();
// do your stuff
// do your stuff
rendezvous.await(); // if you want to be extra sure the ops are interleaved
// do your stuff
} catch (...) {}
finally { conclusion.await(); }
}
};

Thread b = new Thread() {
public void run() {
try {
rendezvous.await();
// do your other stuff
// do your other stuff
rendezvous.await(); // if you want to be extra sure the ops are interleaved
// do your other stuff
} catch (...) {}
finally { conclusion.await(); }
}
};

a.start();
b.start();
conclusion.await();

assertTrue вместо assertEquals(.., правда ..).

вырезать и вставить ошибки вы изменения t2Correct вместо t1Correct

5
ответ дан 4 февраля 2011 в 10:02 Источник Поделиться

Тест в ОП и тест Рона являются допустимыми тесты, но важно понимать, что они, возможно, не удастся, даже если есть законные проблемы параллелизма.

Тест в ОП вряд ли когда-нибудь чередовать вызова add(). Даже если тест бежали тысячи раз, Т1 обычно всегда закончить до Т2 начал.

Тест Рона гарантирует, что вызова add() сделать перемежения с помощью CyclicBarrier. Однако, используя CyclicBarrier гарантирует, что государство поддерживается два потока сбрасывается в основную память, потенциально скрывая проблемы параллелизма в обоих добавить() и сброса().

Оба теста являются достойной, и вы можете также запускать их оба. Ибо истинный мир разума, почему бы не разместить код для логгера на этом сайте?

2
ответ дан 6 февраля 2011 в 07:02 Источник Поделиться