Java 在运行两种不同方法的两个线程之间共享对象
我是java Android新手。。。我正在尝试创建两个名为:Clean和Progress的线程,它们将运行两个不同的方法。每个方法获得相同的对象混合。而Clean将运行一个耗时的方法,该方法是mix的类mix.TimeConsumingMethod的一部分;我希望进度线程通过检查类变量(如mix.length和mix.framesClean)来监视TimeConsumingMethod的进度 在进行中,我检查mix.length>0,如果不是,我希望在此处等待进度,我的应用程序崩溃,在log CAT中,我得到一个错误:Java 在运行两种不同方法的两个线程之间共享对象,java,android,multithreading,Java,Android,Multithreading,我是java Android新手。。。我正在尝试创建两个名为:Clean和Progress的线程,它们将运行两个不同的方法。每个方法获得相同的对象混合。而Clean将运行一个耗时的方法,该方法是mix的类mix.TimeConsumingMethod的一部分;我希望进度线程通过检查类变量(如mix.length和mix.framesClean)来监视TimeConsumingMethod的进度 在进行中,我检查mix.length>0,如果不是,我希望在此处等待进度,我的应用程序崩溃,在log
09-20 10:37:32.773: E/AndroidRuntime(12030): java.lang.IllegalMonitorStateException: object not locked by thread before wait()
调用两个线程的代码片段:
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();
干净运行耗时方法的片段:
long time_start = SystemClock.elapsedRealtime();
mix.Run(Daudio,mu,sigSqr,c);
long time_end = SystemClock.elapsedRealtime();
进展片段:
如果您正在调用wait的线程不拥有您正在调用它的监视器上的锁,则会得到非法监视器状态异常 要做到这一点,您可以在同步块中包围等待调用。在您的情况下,它将类似于:
synchronized(progressThread){
progressThread.wait(50);
}
还有一种方法可以使用holdslockobjectobj方法检查这一点,只有当当前线程持有指定对象上的监视器锁时,该方法才会返回true
有关详细信息,请查看。在调用wait之前需要锁定对象。
synchronized(progressThread){
progressThread.wait(50);
}