我们在使用Timer处理定时任务过程中,Timer的操作函数经常会被频繁调用,这个时候就得考虑多线程的问题了,下面的代码启动两个线程频繁操作Timer,
private Timer mTimer; private void testTimer(){ startTimer(); try{ Log.d(TAG, "sleep"); Thread.sleep(5000); }catch (Exception e){ } stopTimer(); timethread1.start(); timethread2.start(); }
Thread timethread1 = new Thread(new Runnable() { @Override public void run() { for(int i=0; i<100; i++){ Log.d(TAG, "timethread1 startTimer"); startTimer(); } } }); Thread timethread2 = new Thread(new Runnable() { @Override public void run() { for(int i=0; i<100; i++){ Log.d(TAG, "timethread2 startTimer"); startTimer(); } } });
结果程序空指针了,下面我们再优化一下Timer的操作函数,加上方法锁;
private synchronized void startTimer(){ Log.d(TAG, "startTimer"); if(mTimer != null){ mTimer.cancel(); mTimer.purge(); mTimer = null; } mTimer = new Timer(); mTimer.schedule(new TimerTask() { @Override public void run() { Log.d(TAG, "schedule time"); } }, 100, 1000); } private synchronized void stopTimer(){ Log.d(TAG, "stopTimer"); if(mTimer != null){ mTimer.cancel(); mTimer = null; } }
Timer的使用就讲到这里,如有更多使用上的理解,请补充;