Android : 线程的结束,挂起和恢复(下)

来源:互联网 发布:淘宝购物返利 编辑:程序博客网 时间:2024/06/10 06:38

二. 线程的挂起与恢复

   同样, Android线程类也提供了一些公共方法去挂起和恢复线程:

final void resume()                                       

This method is deprecated. Used with deprecated method suspend

final void suspend()

This method is deprecated. May cause deadlocks

       同样不幸的是,通过说明我们可以看到,这些方法Android也是不推荐使用的,经过笔者试验,这些方法也没有效果。那我们如何去挂起和恢复线程呢?笔者又来救赎了。

     Android的类基本都是继承于Object类。此类可以说是Android类的祖先了。如果把Android类比喻为一个生物界,则Object类就是当初生命诞生时候的那个单细胞。

       我们可以发现Object类提供了几个方法 

         final void notify()

Causes a thread which is waiting on this object's monitor (by means of calling one of the wait() methods) to be woken

final void notifyAll()

Causes all threads which are waiting on this object's monitor (by means of calling one of the wait() methods) to be woken

final void wait()

Causes the calling thread to wait until another thread calls the notify() ornotifyAll() method of this object

 

       通过说明我们可以知道,wait方法可以让正在调用的线程处于等待状态,直到其他线程调用了该对象的notify 或者notifyAll,而notify notifyAll方法则是用于唤醒处于等待中的线程。

       同样,线程类也是继承于Object类,但是线程类是一个比较特殊的类,有自己独立的栈机制来处理其方法,参数和局部变量。通过实验,笔者发现,虽然线程类继承于Object类,但是却不能通过waitnotify方法挂起唤醒线程。而要实现上述动作,必须去间接地实现,即在自定义线程类中创建一个Object对象,然后通过对该Object的相关操作实现线程的挂起和唤醒。方法如下:

1.    在自定义线程类的实例化过程中创建一个Object对象。

2.    定义一个变量来记录线程的状态是否挂起,初始化为假。

3.    在线程类中的run函数中的线程执行部分找入锲点来执行下面动作:如果当前状态变量为假(表示线程挂起),则通过1Object对象的wait方法挂起当前线程,即线程暂停在锲点位置,如果被唤起,则将从锲点后继续执行。

4.    定义一个方法来修改线程状态变量为真,从而达到挂起线程的目的。

5.    定义一个方法去唤醒线程。判断如果线程状态变量为真,则修改其为假,然后调用1Object对象的notifyAll方法唤醒对象。(notify方法也可以,但是如果自定义线程较多时容易造成死锁)。

综上,当自定义线程运行后我们可以通过4中的方法挂起线程,通过5中的方法唤醒线程。

 

程序实例 :

class SearchThread extends Thread

   {

      private Object mPauseLock ;

      private boolean mPauseFlag ;   

     

      public SearchThread()

      {

         

          mPauseLock = new Object() ;

          mPauseFlag = false ;

      }

     

      public void onPause()

      {

          synchronized (mPauseLock) {

             mPauseFlag = true;

             }

      }

     

      public void onResume()

      {

          synchronized (mPauseLock) {

             mPauseFlag = false ;

             mPauseLock.notifyAll() ;

             }

      }

            

      private void pauseThread()

      {

          synchronized (mPauseLock) {

             if(mPauseFlag)

             {

                try{

                   mPauseLock.wait() ;

                }catch(Exception e){

                   Log.v("thread", "fails") ;

                }

             }

             }

      }    

 

@Override

      public void run()

    {

       ……

       //---线程执行部分,仅仅举例为了说明-----

         for(int i = 0; i < 100; i++)

      {

          pauseThread() ;

          ……

          for(int j = 0; j < 100; j++)

          {

               pauseThread() ;

               ……

          }

}

       //-----end----------

       ……

      }

}

0 0