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()); } } }; }