是的,我之前已经看过类似主题的问题,但它们似乎对我没有帮助。如果有重复,请指出我的问题,谢谢
我这里有两个问题,第一个是标题问题:
@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();}
答案 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();
}
});
}
您锁定了findViewById
和setOnClickListener
的调用,但没有锁定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
而不是主要类。