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