IllegalMonitorStateException:对象在notify()之前未被线程锁定

时间:2014-08-12 14:55:24

标签: java android multithreading

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

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

@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()的作用是暂停所有正在运行的代码,直到某个事件(例如点击按钮)导致调用notify()。

第二个问题是在我点击按钮之前,Toast出现了。我假设当我调用wait()时,所有代码都等待直到我点击按钮,其中将调用notify()并继续执行代码。但恰巧的是,Toast似乎忽略了wait()并且无论如何都在运行。

如果有任何问题,请提出要求,谢谢。

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

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

1 个答案:

答案 0 :(得分:1)

下面

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位于任何同步块之外。

您应该在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而不是主要类。