Java 在运行两种不同方法的两个线程之间共享对象

Java 在运行两种不同方法的两个线程之间共享对象,java,android,multithreading,Java,Android,Multithreading,我是java Android新手。。。我正在尝试创建两个名为:Clean和Progress的线程,它们将运行两个不同的方法。每个方法获得相同的对象混合。而Clean将运行一个耗时的方法,该方法是mix的类mix.TimeConsumingMethod的一部分;我希望进度线程通过检查类变量(如mix.length和mix.framesClean)来监视TimeConsumingMethod的进度 在进行中,我检查mix.length>0,如果不是,我希望在此处等待进度,我的应用程序崩溃,在log

我是java Android新手。。。我正在尝试创建两个名为:Clean和Progress的线程,它们将运行两个不同的方法。每个方法获得相同的对象混合。而Clean将运行一个耗时的方法,该方法是mix的类mix.TimeConsumingMethod的一部分;我希望进度线程通过检查类变量(如mix.length和mix.framesClean)来监视TimeConsumingMethod的进度

在进行中,我检查mix.length>0,如果不是,我希望在此处等待进度,我的应用程序崩溃,在log CAT中,我得到一个错误:

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);
}