关于同步锁的问题,请教各位大牛··(急~~)

小弟在做一个一个程序的时候,希望主程序执行到一定代码时,启动一个线程,并等待主程序的一个标识符变化时唤醒,进而执行之后的代码,程序代码如下:
出现的问题是系统提示我没有上锁,这是为什么呢?请教各位大牛···

public class TimerTest extends Activity implements Runnable{

int num=0; 
 Thread read=new Thread(this); 
 int[] timerlenth={5000,6000,2000,4000}; 
 int[] number={1,2,3,4}; 
 Handler handler; 
             TimerTask task; 
 ViewFlipper vf; 
 Timer timer = new Timer(); 
  /** Called when the activity is first created. */ 

public Handler createHandle() 
 { 
 Handler handler = new Handler(){    
 public void handleMessage(Message msg) {    
 switch (msg.what) { 
      case 1:  

          vf=(ViewFlipper)findViewById(R.id.ViewFlipper01); 
          num=1; 

   break;            

      super.handleMessage(msg);    
  }    

 }; 
return handler; } 

 public TimerTask createTimerTask(final int i,final Handler handler) 
{ 
 TimerTask task = new TimerTask(){    

      public void run() {    
            Message message = new Message();        
             message.what = i;        
             handler.sendMessage(message);      
         }    

     }; 
return task; 
} 
 @Override 
 public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    //timer.schedule(task, 5000); 
    //for(int i=0;i<timerlenth.length;i++) 
    //{     

    handler=createHandle(); 
       task= createTimerTask(number[0], handler); 
    timer.schedule(task,timerlenth[0]); 
     try { 
        Go(read,num); 
    } catch (InterruptedException e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
    } 
        //vf=(ViewFlipper)findViewById(R.id.ViewFlipper01); 

        /**/ 
        vf.startFlipping(); 
        try { 
            Thread.sleep(10); 
        } catch (InterruptedException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
        } 
        vf.stopFlipping(); 


   // } 

} 
@Override 
public  void run() { 
    // TODO Auto-generated method stub       
} 
public synchronized void Go(Thread a,int b) throws InterruptedException    {//这个方法是设定线程锁的 
      while(b==0) 
      { 
                a.wait();     
      } 
      vf.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_in1)); 
       vf.setOutAnimation(AnimationUtils.loadAnimation(this,                    R.anim.push_out1)); 
       num=0; 
       notify(); 
} 

1个回答

[code="java"]
public synchronized void Go(Thread a,int b) throws InterruptedException {//这个方法是设定线程锁的
while(b==0)
{
a.wait();

}
vf.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_in1));
vf.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_out1));
num=0;
notify();
} [/code]

这个函数,有问题。
首先 a.wait() 要能正常运行,必须要这样
[code="java"]synchronized (a) { a.wait(); } [/code],
你这里语义有问题, a.wait() 的意思不是让a对应的线程等待,调用 Go 函数的线程才会等待。

你这样写并不得到你预期的结果。

------------------------

可以通过如下方式实现你要的结果。

在 a Thread 的run方法中,作如下判断:
[code="java"]
while(b==0) { //前提,你必须要正确获得 b 的真正引用,这里是示例,你要根据实际情况修改。
synchronized (this) {
wait();
}
}
[/code]

Go 可以这样实现:
public synchronized void Go(Thread a,int b) throws InterruptedException {//这个方法是设定线程锁的
/*
while(b==0)
{
a.wait();

}
*/
vf.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_in1));
vf.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_out1));
num=0;
if (b != 0) {
synchronized (a) {
a.notify();
}
}
} [/code]

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问