我们如何测试同步代码?

时间:2016-12-21 23:02:56

标签: java multithreading

最近我正在编写一段涉及同步的代码,并在如何测试它方面苦苦挣扎。为了解决这个问题,我们可以考虑为CountDownLatch编写一个单元测试:

CountDownLatch l = new CountDownLatch(1);

new Thread() {
    @Override
    void run() {
        l.await();
        System.out.println("good!");
    }
}.start();

Thread.sleep(1000); // wait for thread to run
if (the thread is alive)
    l.countDown();
else
    System.out.println("bad!");

所以问题是,不能保证在所有机器的所有情况下{1}都足够1秒。所以我的目标是消除这种类型的睡眠代码,以便在测试同步时期望某种状态,但很快就意识到它开始变成暂停问题。

我目前的解决方案是查询线程的状态:

sleep

我的问题是:

  1. 那会有用吗?也就是说,此刻线程的状态是否会被切换为原子,在这种情况下,倒计时锁存器达到唤醒状态?(该文档没有说明状态的更改时间)
  2. 你有更好的建议吗?

1 个答案:

答案 0 :(得分:0)

看看你的例子,我感觉你正在倒计时使用倒计时闩锁。为什么你不能做那样的事情:

    @Test
    public void testThreads() throws Exception {
        CountDownLatch l = new CountDownLatch(1);

        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("Parallel thread is doing something.");
                try {
                    // instead of this sleep you put your logic that you want to be executed.
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                l.countDown();
            }
        }).start();

        System.out.println("Main thread is waiting for parallel thread");
        l.await();

        System.out.println("Done.");
    }

如果我误解了你的问题,请纠正我。

但总的来说,我同意你的帖子下面的一条评论,你可能不应该用单元测试测试多线程。