gpt4 book ai didi

java - 线程等待时出现大量 IllegalMonitorStateException

转载 作者:行者123 更新时间:2023-12-02 07:10:56 24 4
gpt4 key购买 nike

每当我调用pauseThread()时,它总是抛出IllegalMonitorStateException。

我在文档中注意到我需要拥有对象监视器才能使线程等待。

用这段代码

synchronized (obj) {
while (<condition does not hold>)
obj.wait();
... // Perform action appropriate to condition
}

在这种情况下,obj 参数将是 runnerwhile(ServerTickHandler.peakBlockDestructionQueue() == null){}但是当 obj.wait();被调用需要通知吗?或者当 while 条件不成立时它会通知自己Synchronized (){} 代码块会持续循环还是仍然需要在 Synchronized (){} 内使用 while 循环来完成此操作?

编辑:syncronized(){} 会通过 run 方法进入内部吗?

这是我的类(class)

public class ServerTickSaveHandler implements Runnable
{
private static Thread runner;
/**
* Creates a new thread for dealing with logging block destruction when using certain tools.
* @param threadName Name of the thread.
*/
public ServerTickSaveHandler(String threadName)
{
runner = new Thread(this, threadName);
}
/**
* If thread has nothing to do we shall pause it so it does not needlessly run :D.
* @throws InterruptedException
*/
public void pauseThread()
{
try
{
runner.wait();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
catch(IllegalMonitorStateException e)
{
e.printStackTrace();
}
}
/**
* If Items from DropItemQueue need ticking lets resume this thread.
* @throws IllegalMonitorStateException
*/
public void resumeThread()
{
try
{
runner.notify();
}
catch (IllegalMonitorStateException e)
{
e.printStackTrace();
}
}
/**
* The thread that is spawned when this object is created.
*/
public void run()
{
while (true)
{
// long start = System.currentTimeMillis();

WorldData worldData = ServerTickHandler.getBlockDestructionQueue();
if (worldData != null)
{
worldData.saveToFile();
}
else pauseThread();

// long end = System.currentTimeMillis();

// NumberFormat formatter = new DecimalFormat("#0.00000");
// Utils.log("Save Tick Handler Execution time is " +
// formatter.format((end - start) / 1000d) + " seconds");
}
}
/**
* Starts the thread.
* @throws IllegalStateException
*/
public void startThread()
{
try
{
runner.start();
}
catch (IllegalStateException e)
{
e.printStackTrace();
}
}
}

最佳答案

如文档所述,您必须持有调用 wait()/notify() 的对象的监视器。由于您在 runner 上调用这些方法,因此这些指令必须位于

synchronized(runner) {

阻止。

也就是说,在线程上调用 wait()/notify() 是一个非常奇怪的选择。您最好使用最终的专用锁对象来等待/通知。您的程序中还有其他错误的选择。例如,从构造函数初始化静态字段。

wait()notify() 是非常低级的、难以使用的原语。您应该使用更高级别的抽象,例如锁、信号量、CountDownLatches、BlockingQueues 等。

关于java - 线程等待时出现大量 IllegalMonitorStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15535815/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com