java线程生命空间

java 多线程在android 开发中的使用频率很高,用一个形象的比喻来演示线程的生命周期: 和人有生老病死同样,线程也有它完整的生命周期: 1.  新生(NEW):The thread has been created, but has never been started. 表明线程的对象已经被初始化,但还没有运行start() 方法,一样run()也未执行。 2.  就绪(RUNNABLE ):表示线程能够执行,但尚未执行,何时执行run()方法得看系统的调度策略,好比start()执行,run()未执行,在这个阶段系统要为线程分配运行须要的空间如栈、程序计数器,或者线程在wait()中被激活。 3. 运行(RUNNING):根据系统调度策略,该线程获取CPU控制权,进入运行状态,执行run()方法. 4.阻塞(BLOCKED):运行状态下的线程可能进入阻塞状态,好比等待某个同步锁(Syncronize),等待wait()中等待notify(),sleep(time); 5.死亡(TERMINATED ):The thread has been terminated. 线程的正式结束方式,run方法执行完毕并返回。 在Thread中应该如何更好的控制整个生命周期,咱们先来看看Thread类代码,下面的方法会影响到线程的生命周期,为了方便省略了实现细节: package java.lang; public class Thread{ public void start(); // 线程的启动 public void run(); // 线程体 public void stop(); // 已废弃 public void resume(); // 已废弃 public void suspend(); // 已废弃 public static void sleep(long millis); // 在指定的毫秒数内让当前正在执行的线程休眠 public static void sleep(long millis, int nanos); // 同上,增长了纳秒参数 public boolean isAlive(); // 测试线程是否处于活动状态 public void interrupt(); // 中断线程 public boolean isInterrupted(); // 测试线程是否已经中断 public static boolean interrupted(); // 测试当前线程是否已经中断 public void join() throws InterruptedException; // 等待该线程终止 public void join(long millis) throws InterruptedException; // 等待该线程终止的时间最长为 millis 毫秒 public void join(long millis, int nanos) throws InterruptedException; // 等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒 } 重点:停滞状态 1.经过sleep(millis)使线程进入休眠,该方法在指定的时间内没法被唤醒。 2.经过wait() 暂停线程,除非收到notify()或notifyAll()消息,不然不会变回可执行状态。wait()和notify()两个函数都是Object的 一部分,不像sleep()那样属于Thread,这是由于两个函数会取用对象的机锁,而机锁正是每一个继承自Object对象都拥有的。如此一来咱们能够 把wait()置于任何同步函数内,也只能在同步函数中调用wait()。sleep()、suspend()、resume()能够在全部非同步函数中 使用,由于它们不会取用机锁。 3. 线程正在等待某个IO动做完成。 4.线程正尝试调用一个同步对象,但还没有取得该对象机锁 syncronized()。 sleep()和wait()均可以使线程进入中止状态,两者的实现机理不同: 一、sleep()不会释放锁,其余线程不能够访问同步监视器;线程wait()会释放锁,其余线程能够访问同步监视器---最主要区别; 二、参数不同,wait()能够无参数----等待notify()来唤醒,也能够设定一个int值,时间一到天然醒来,进入runnable状态,同时收回对象锁;sleep(int)必须有一个int型参数,时间到后进入runnable状态;两种状况都不必定能够立刻执行,而是进入可运行线程的队列中,什么时候执行 根据CPU分配机制决定执行时间; 三、sleep()是Thread的方法,wait()是Object的方法; 下面的例子表现了一个完整的线程生命周期: import android.app.Activity;  import android.media.AudioFormat;  import android.media.AudioManager;  import android.media.AudioRecord;  import android.media.AudioTrack;  import android.media.MediaRecorder;  import android.os.Bundle;  import android.os.Looper; import android.util.Log; import android.view.View;  import android.widget.Button;  import android.widget.SeekBar;  import android.widget.Toast;    public class AUDIOBUFFERActivity extends Activity {      /** Called when the activity is first created. */      Button btnstart, btnStop, btnExit;      static final String LOG_TAG = "TestMultiThread";     private WorkingThread mWorkingThread;     public Object syncobj;     public Boolean mStop;     public Boolean mCanDo;     public ClickEvent mClickEvent;     @Override      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.main);          setTitle("test thread");         btnstart = (Button)AUDIOBUFFERActivity.this.findViewById(R.id.btnRecord);         btnStop = (Button)AUDIOBUFFERActivity.this.findViewById(R.id.btnStop);         btnExit = (Button)AUDIOBUFFERActivity.this.findViewById(R.id.btnExit);         mClickEvent = new ClickEvent();         btnStop.setOnClickListener(mClickEvent);         btnstart.setOnClickListener(mClickEvent);         btnExit.setOnClickListener(mClickEvent);         syncobj = new Object();         mStop = true;          mCanDo = true;         mWorkingThread = new WorkingThread();         mWorkingThread.start();     }      class ClickEvent implements View.OnClickListener {            @Override          public void onClick(View v) {              if (v == btnstart)             {                  if(mStop)                 {                     mStop = false;                     requestRun();                 }             }             else if (v == btnStop)             {                  mStop = true;             }             else if (v == btnExit)             {                  mCanDo = false;                 AUDIOBUFFERActivity.this.finish();              }          }      }      public void changeToWait()     {         synchronized(mWorkingThread)         {             try {                 mWorkingThread.wait();             } catch (InterruptedException e) {                 // TODO Auto-generated catch block                 e.printStackTrace();             }         }     }         public void requestRun()     {         synchronized(mWorkingThread)         {             mWorkingThread.notify();         }     }       class WorkingThread extends Thread {                 public void run() {              try {                 while(mCanDo)                 {                                        if(mStop)                     {                         changeToWait();                     }                     synchronized(syncobj)                     {                         sleep(500);                     }                     Log.d(LOG_TAG, "WorkingThread in run");                                    }                             } catch (Throwable t) {                  Log.d(LOG_TAG, "error happened==t:"+t.toString());             }          }      };  }
相关文章
相关标签/搜索