我是新的Java Android ...我试图创建两个线程(名为:Clean和Progress),它将运行两种不同的方法,每个方法都得到相同的对象methodmix。而Clean将运行一个耗时method是混合的(mix.TimeConsumingMethod();)类的一部分,我想Progress thread通过检查类变量监测TimeConsumingMethod()进度如mix.length和mix.framesClean在两个线程之间共享一个对象,运行两种不同的方法Android Java 正在进行
我检查,看看mix.length > 0如果不是我想Progress等待在这里我的一个第崩溃和log CAT我得到的错误:代码调用两个线程
09-20 10:37:32.773: E/AndroidRuntime(12030): java.lang.IllegalMonitorStateException: object not locked by thread before wait()
片段:。片断
Clean运行耗时的方法
mix = new MixMaxMain();
progressThread = new Thread(new Runnable() {
@Override
public void run() {
Progress (mix);
}
},"Progress Thread");
CleanThread = new Thread(new Runnable() {
@Override
public void run() {
Clean (mix);
}
},"Cleaner Thread");
Log.d("STOP", "SEnding cleanThread AND progress Thread");
CleanThread.start();
progressThread.run();
:片断
Progress
long time_start = SystemClock.elapsedRealtime();
mix.Run(Daudio,mu,sigSqr,c);
long time_end = SystemClock.elapsedRealtime();
:
while(mix.length==0) {try {
Log.d("Progress", "Length is Zero");
Thread.sleep(1);//fails here!!
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
Log.d("Progress", "Clean Has Started");
int totalProgressLen = (int)(mix.length+0.7*mix.length);
while(mix.done==false)
{
try {
progressThread.wait(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
progress.setProgress(mix.framsClean*256/totalProgressLen );
}
2014-09-20
Hillel
+0
您需要在调用wait之前锁定对象。 http://stackoverflow.com/questions/661068/threading-in-java-how-to-lock-an-object –
2014-10-04 08:50:46