2011-08-06 6 views
3

こんにちは、私はテストのためにAndroidのワーカースレッドをシミュレートしようとしています。 アクティビティには、ワーカースレッド上でnotify()を呼び出すボタンがあり、そのボタンを10回反復した後にスリープ状態にします。Androidのワーカースレッド

私のコードとエラーのスタックトレースです。どうすれば解決できますか?ありがとう

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 


    t= new Thread(){ 
     public void run(){ 
      int i=0; 
      while(true){ 


       if (i%10==9){ 
        //Simulated end of data until notified again 
        try { 
         this.wait(); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
      Log.d("Test",""+i); 
      SystemClock.sleep(1000); 
      } 
     } 
    }; 
    t.start(); 


    findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      t.notify(); 

     } 
    }); 
} 





08-06 05:39:45.320: ERROR/AndroidRuntime(4480): FATAL EXCEPTION: main 
08-06 05:39:45.320: ERROR/AndroidRuntime(4480): java.lang.IllegalMonitorStateException: object not locked by thread before notify() 
08-06 05:39:45.320: ERROR/AndroidRuntime(4480):  at java.lang.Object.notify(Native Method) 
08-06 05:39:45.320: ERROR/AndroidRuntime(4480):  at com.example.memorycrash.MemoryCrashTestActivity$2.onClick(MemoryCrashTestActivity.java:51) 
08-06 05:39:45.320: ERROR/AndroidRuntime(4480):  at android.view.View.performClick(View.java:2538) 
08-06 05:39:45.320: ERROR/AndroidRuntime(4480):  at android.view.View$PerformClick.run(View.java:9152) 
08-06 05:39:45.320: ERROR/AndroidRuntime(4480):  at android.os.Handler.handleCallback(Handler.java:587) 
08-06 05:39:45.320: ERROR/AndroidRuntime(4480):  at android.os.Handler.dispatchMessage(Handler.java:92) 
08-06 05:39:45.320: ERROR/AndroidRuntime(4480):  at android.os.Looper.loop(Looper.java:130) 
08-06 05:39:45.320: ERROR/AndroidRuntime(4480):  at android.app.ActivityThread.main(ActivityThread.java:3687) 
08-06 05:39:45.320: ERROR/AndroidRuntime(4480):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-06 05:39:45.320: ERROR/AndroidRuntime(4480):  at java.lang.reflect.Method.invoke(Method.java:507) 
08-06 05:39:45.320: ERROR/AndroidRuntime(4480):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842) 
08-06 05:39:45.320: ERROR/AndroidRuntime(4480):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 
08-06 05:39:45.320: ERROR/AndroidRuntime(4480):  at dalvik.system.NativeStart.main(Native Method) 

答えて

2

あなたの解決策はここにあります。 回答は既にStackOverflowにありました。

オブジェクトのwait()、notify()、またはnotifyAll()を呼び出すには、メソッドを呼び出すオブジェクトのモニタを最初に所有していなければなりません。どのようにそれを行う必要があります:

Runnable runnable = new Runnable() { 
    public void run() { 
     // wait(); This call wouldn't work 
     syncronized (this) { 
     wait(); // This call will work 
     } 
    } 
}; 

をその実行可能なことを通知するためにあなたもモニター

// runnable.notifyAll(); this call will not work 
syncronized (runnable) { 
    runnable.notifyAll(); // this call will work 
} 
に持っている必要があります
関連する問題