Java 我们如何测试同步代码?

Java 我们如何测试同步代码?,java,multithreading,Java,Multithreading,最近,我正在编写一段涉及同步的代码,并努力研究如何测试它。为了解决这个问题,我们可以考虑编写一个单元测试,用于: 所以问题是,不能保证在所有机器上的所有情况下,1秒的睡眠都是足够的。因此,我的目标是消除这种类型的休眠代码,使其在测试同步时预期处于某种状态,但很快就会意识到它开始成为停止问题 我当前的解决方案是查询线程的状态: Thread t = ... t.start(); if (t.getState() == Thread.State.WAITING) { l.countDown

最近,我正在编写一段涉及同步的代码,并努力研究如何测试它。为了解决这个问题,我们可以考虑编写一个单元测试,用于: 所以问题是,不能保证在所有机器上的所有情况下,1秒的睡眠都是足够的。因此,我的目标是消除这种类型的休眠代码,使其在测试同步时预期处于某种状态,但很快就会意识到它开始成为停止问题

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

Thread t = ...
t.start();

if (t.getState() == Thread.State.WAITING) {
    l.countDown();
    assert(t.getState() == Thread.State.RUNNABLE); // or running or terminated
}
我的问题是:

这样行吗?i、 e.线程的状态是否会在此时自动切换,在这种情况下,倒计时锁存器达到唤醒状态?doc没有说明状态的更改时间 你有更好的建议吗?
查看您的示例,我感觉您正在使用倒计时闩锁。为什么你不能这样做:

    @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.");
    }
如果我误解了你的问题,请纠正我


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

不要测试线程状态,测试行为。我不能告诉你你的代码试图做什么,所以我不能告诉你如何测试它。可能重复的@БПббббббббббббббббббб。FWIW,我通常通过在单独的单线程ExecutorServices上放置有问题的可运行/可调用项,然后让我的单元测试使用shutdown和awaitTermination等待它们完成,如果它们在几百毫秒内没有完成,则会有一个超时。使用Java8 ListenableFutures可能有更好的方法。这种单元测试的目的是什么?当存在同步的代码块时,您不信任Java,而第二个线程将等待第一个线程完成它?还是怎样
    @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.");
    }