0

我在我的代码中运行多个线程和处理程序。

这是我的处理程序

PrizeRunnable mTempPotionRunnable = new PrizeRunnable(aaa);
handler.postDelayed(mTempPotionRunnable, 4000);

        class PrizeRunnable implements Runnable {
        String type;

        PrizeRunnable(String type) { 
            this.type = type; 
        }

        public void run() {
            synchronized (this) {
                  if(!mIsHandlerStarted){
                      if(type.equals(aaa))
                          // Do something
                      else if(type.equals(bbb))
                          // Do something

                    mIsHandlerStarted = true;
                    handler.removeCallbacks(this);
                  }
              }
        }
    }

但有时它会同时运行。

我不知道原因。

更新

我尝试将其更改为:

handler.postDelayed(mTempPotionRunnable, 4000);

Runnable mTempPotionRunnable = new Runnable() {
@Override
public void run() {
      synchronized (this) {
          if(!mIsHandlerStarted){
                // Do something
                mIsHandlerStarted = true;
                handler.removeCallbacks(mMetalRunnable);
          }
      }
}
};

可能会解决我的问题。我正在测试这种方法。

但我无法将参数传递给我的Runnable. 我该怎么做?

4

2 回答 2

1

我的猜测是,这是因为您正在当前实例上进行同步:

synchronized (this) {
    ...
}

因此,除非您将相同的实例传递给所有处理程序,否则每个处理程序都将使用不同的锁定对象。尝试使用静态锁:

class PrizeRunnable implements Runnable {
    String type;
    private static final Object lock = new Object();

    PrizeRunnable(String type) { 
        this.type = type; 
    }

    public void run() {
        synchronized (lock) {
              if(!mIsHandlerStarted){
                  if(type.equals(aaa))
                      // Do something
                  else if(type.equals(bbb))
                      // Do something

                mIsHandlerStarted = true;
                handler.removeCallbacks(this);
              }
          }
    }
}
于 2012-10-03T07:42:34.640 回答
0

制作全局变量,我可以将参数传递给我的Runnable

于 2012-10-11T03:32:51.773 回答