我正在开发一个应用程序,在某些测试用例中,进行无限循环,但如果我重做相同的测试,它会很顺利。为了防止它,我使用辅助线程来监视自任务开始以来经过的时间,但我目前没有使用同步块,因为我不知道如何。
以下是一个例子:
public class ThreadHarvest {
private static final ReentrantLock lock = new ReentrantLock();
private static boolean safe;
public static void main(String[] args) throws InterruptedException
{
Thread task = new Thread(() ->{
lock.lock();
safe = false;
for (long i = 10000000L; i > 0L; --i)
System.out.println(i);
safe = true;
lock.unlock();
System.out.println("Safe ended!");
});
task.start();
while (lock.isLocked() == false);
lock.tryLock(5, TimeUnit.SECONDS);
if (!safe)
{
task.stop();
System.out.println("Force ended!");
}
}
}
此外,还有一个特定的区域可以保证安全,就在释放锁定之后。而且我也知道停止方法已被弃用,所以如果你碰巧有一些好的想法让它不那么容易出错,我会非常感激:D
答案 0 :(得分:0)
我不太了解您的问题,但这里有一些关于您的代码的一般性评论。
Thread.sleep(10);
或其他内容。lock; try { } finally { unlock; }
。然后你知道你的锁将被解锁,即使它会引发异常。AtomicBoolean
使用safe
或将其标记为volatile boolean
,否则主线程可能看不到任何更改。无法保证与isLocked()
或tryLock()
进行内存同步。task.join(5, TimeUnit.SECONDS)
然后测试if (task.isAlive()) { killItWithFire(); }
,而不是锁定和安全。我目前正在开发一款应用程序,在某些测试用例中,会进行无限循环,
在我看来,你应该集中精力解决这个问题。 thread.stop()
是一个真正的黑客。