0

我指的是http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/AlarmService_Service.html

那里的线程的runnable看起来像这样

Runnable mTask = new Runnable() 
{        
    public void run() 
    {  
        Log.v("service", "thread is running after 5 min");
        // Normally we would do some work here...  for our sample, we will           
        // just sleep for 30 seconds.            
        long endTime = System.currentTimeMillis() + 15*1000;            
        while (System.currentTimeMillis() < endTime) 
        {                
            synchronized (mBinder) 
            {                    
                try 
                {                        
                    mBinder.wait(endTime - System.currentTimeMillis());      
                } 
                catch (Exception e) 
                {                    

                }                
            }            
        }            // Done with our work...  stop the service!            
        AlarmService_Service.this.stopSelf();     
    }    
}

我承认我对同步的概念有一些问题......线程运行while循环等待15s,在那个循环中我等待15s。那么如果我只想写一个日志条目,例如 Log.v(TAG,TEXT);,runnable 会是什么样子?如果我想在我自己的数据库表中写入一个新条目,会发生什么变化?

谢谢。

4

2 回答 2

0

如果您只想要一个日志语句,那么以下将正常工作

Runnable mTask = new Runnable() 
{        
    public void run() 
    {  
        Log.v("TAG", "Some verbose log message");
    }    
}

是否需要在对象上使用synchronized取决于对象是否是线程安全的。如果它不是线程安全的,那么您将需要使用同步块确保一次只有一个线程访问该对象。在您的示例mBinder中不是线程安全的,因此为了调用wait活页夹的方法,您需要确保您是唯一访问它的线程。

Arunnable最常用于在不同的线程中执行代码,以便长时间运行的操作(例如 IO,但在这种情况下只是等待)不会阻塞 UI 线程。

于 2011-04-05T15:26:21.760 回答
0

只需更换

尝试 {
mBinder.wait(endTime - System.currentTimeMillis());
} 捕捉(异常 e){

}

...与您要执行的代码?

同步只是断言一次只有一个进程访问线程。

于 2011-04-05T12:57:23.417 回答