gpt4 book ai didi

java - 非法监视器状态异常 : object not locked by thread before notify()

转载 作者:行者123 更新时间:2023-12-01 12:39:18 24 4
gpt4 key购买 nike

是的,我之前看过类似主题的问题,但它们似乎对我没有帮助。如果有重复,请指出问题,谢谢

我这里有两个问题,第一个是标题问题:

@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//Starts up method1 & method2 in a try-catch
try{
method1();
method2();
new CountDownLatch(1);
CountDownLatch.await();
}catch(InterruptedException e){
// TODO Auto-generated catch
// block
e.printStackTrace();
}
//This Toast should only run after notify() is called
Toast.makeText(firstClass.this, "This is toasty", Toast.LENGTH_SHORT).show();
}


//Start of method 1, which is currently useless
public void method1() throws InterruptedException{
//Creates new thread
Thread thread = new Thread(new Runnable(){
@Override
public void run(){
try{
synchronized(SecondClass.this){
}
}catch(Exception e){
e.printStackTrace();
}
}

});
thread.start();
}

public void method2(){
Thread thread2 = new Thread(new Runnable(){
@Override
public void run(){

//Sets a button, when the button is clicked, then the code is continued
final Button bNext = (Button) findViewById(R.id.bIsoAbunSave);
bNext.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0){
synchronized(SecondClass.this){
CountDownLatch.countDown();
}
}
});
}


});
thread2.start();
}

据我了解,如果错误,请纠正我,wait() 的作用是暂停所有正在运行的代码,直到发生事件(例如单击按钮)导致调用 notification()。

第二个问题是在我单击按钮之前,Toast 就出现了。我假设当我调用 wait() 时,所有代码都会等待,直到我单击该按钮,其中将调用 notification() 并且代码将继续。但实际发生的情况是,Toast 似乎忽略了 wait() 并仍在运行。

如有任何问题,欢迎提问,谢谢。

编辑:logcat 消息显示崩溃发生在:

synchronized(SecondClass.this){notify();}

最佳答案

这里

synchronized(this){
//Sets a button, when the button is clicked, then the code is continued
final Button bNext = (Button) findViewById(R.id.bIsoAbunSave);
bNext.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0){
notify();
}
});
}

您锁定了 findViewByIdsetOnClickListener 的调用,但不锁定 onClick 方法,因此调用 notify 时位于任何同步块(synchronized block)之外。

您应该将锁移到 onClick 方法内,该方法是要阻止的代码块

//Sets a button, when the button is clicked, then the code is continued
final Button bNext = (Button) findViewById(R.id.bIsoAbunSave);
bNext.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0){
synchronized(TopClass.this){ notify(); }
}
});

(记住this在内部类中是不同的)

无论如何,不​​建议使用 wait/notify,请考虑使用 JDK 中的其他多线程类和集合之一。

<小时/>
synchronized(this){
//These statements *should* make the code wait until I click the button
wait();
}

在这里,您同步的是Runnable而不是主类。

关于java - 非法监视器状态异常 : object not locked by thread before notify(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25267571/

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