游戏开发者社区

java线程生命空间

查看: 1260|回复: 0

Rank: 7Rank: 7Rank: 7Rank: 7

威望
0 点
义气
20 点
发表于 2013-7-31 21:58:44 |显示全部楼层
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类代码,下面的方法会影响到线程的生命周期,为了方便省略了实现细节:

重点:停滞状态


1.通过sleep(millis)使线程进入休眠,该方法在指定的时间内无法被唤醒。

2.通过wait() 暂停线程,除非收到notify()或notifyAll()消息,否则不会变回可执行状态。wait()和notify()两个函数都是Object的 一部分,不像sleep()那样属于Thread,这是因为两个函数会取用对象的机锁,而机锁正是每个继承自Object对象都拥有的。

如此一来我们可以把wait()置于任何同步函数内,也只能在同步函数中调用wait()。sleep()、suspend()、resume()可以在所有非同步函数中 使用,因为它们不会取用机锁。

3. 线程正在等待某个IO动作完成。

4.线程正尝试调用一个同步对象,但尚未取得该对象机锁 syncronized()。

sleep()和wait()都可以使线程进入停止状态,二者的实现机理不一样:

1、sleep()不会释放锁,其他线程不可以访问同步监视器;线程wait()会释放锁,其他线程可以访问同步监视器---最主要区别;

2、参数不一样,wait()可以无参数----等待notify()来唤醒,也可以设定一个int值,时间一到自然醒来,进入runnable状态,同时收回对象锁;sleep(int)必须有一个int型参数,时间到后进入runnable状态;两种情况都不一定可以马上执行,而是进入可运行线程的队列中,何时执行 根据CPU分配机制决定执行时间;

3、sleep()是Thread的方法,wait()是Object的方法;

  1. package java.lang;
  2. public class Thread{
  3. public void start(); // 线程的启动
  4. public void run(); // 线程体
  5. public void stop(); // 已废弃
  6. public void resume(); // 已废弃
  7. public void suspend(); // 已废弃
  8. public static void sleep(long millis); // 在指定的毫秒数内让当前正在执行的线程休眠
  9. public static void sleep(long millis, int nanos); // 同上,增加了纳秒参数
  10. public boolean isAlive(); // 测试线程是否处于活动状态
  11. public void interrupt(); // 中断线程
  12. public boolean isInterrupted(); // 测试线程是否已经中断
  13. public static boolean interrupted(); // 测试当前线程是否已经中断
  14. public void join() throws InterruptedException; // 等待该线程终止
  15. public void join(long millis) throws InterruptedException; // 等待该线程终止的时间最长为 millis 毫秒
  16. public void join(long millis, int nanos) throws InterruptedException; // 等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒
  17. }
复制代码

下面的例子表现了一个完整的线程生命周期:

  1. import android.app.Activity;
  2. import android.media.AudioFormat;
  3. import android.media.AudioManager;
  4. import android.media.AudioRecord;
  5. import android.media.AudioTrack;
  6. import android.media.MediaRecorder;
  7. import android.os.Bundle;
  8. import android.os.Looper;
  9. import android.util.Log;
  10. import android.view.View;
  11. import android.widget.Button;
  12. import android.widget.SeekBar;
  13. import android.widget.Toast;

  14. public class AUDIOBUFFERActivity extends Activity {
  15. /** Called when the activity is first created. */
  16. Button btnstart, btnStop, btnExit;
  17. static final String LOG_TAG = "TestMultiThread";
  18. private WorkingThread mWorkingThread;
  19. public Object syncobj;
  20. public Boolean mStop;
  21. public Boolean mCanDo;
  22. public ClickEvent mClickEvent;
  23. @Override
  24. public void onCreate(Bundle savedInstanceState) {
  25. super.onCreate(savedInstanceState);
  26. setContentView(R.layout.main);
  27. setTitle("test thread");
  28. btnstart = (Button)AUDIOBUFFERActivity.this.findViewById(R.id.btnRecord);
  29. btnStop = (Button)AUDIOBUFFERActivity.this.findViewById(R.id.btnStop);
  30. btnExit = (Button)AUDIOBUFFERActivity.this.findViewById(R.id.btnExit);
  31. mClickEvent = new ClickEvent();
  32. btnStop.setOnClickListener(mClickEvent);
  33. btnstart.setOnClickListener(mClickEvent);
  34. btnExit.setOnClickListener(mClickEvent);
  35. syncobj = new Object();
  36. mStop = true;
  37. mCanDo = true;
  38. mWorkingThread = new WorkingThread();
  39. mWorkingThread.start();
  40. }

  41. class ClickEvent implements View.OnClickListener {

  42. @Override
  43. public void onClick(View v) {
  44. if (v == btnstart)
  45. {
  46. if(mStop)
  47. {
  48. mStop = false;
  49. requestRun();
  50. }
  51. }
  52. else if (v == btnStop)
  53. {
  54. mStop = true;
  55. }
  56. else if (v == btnExit)
  57. {
  58. mCanDo = false;
  59. AUDIOBUFFERActivity.this.finish();
  60. }
  61. }
  62. }
  63. public void changeToWait()
  64. {
  65. synchronized(mWorkingThread)
  66. {
  67. try {
  68. mWorkingThread.wait();
  69. } catch (InterruptedException e) {
  70. // TODO Auto-generated catch block
  71. e.printStackTrace();
  72. }
  73. }
  74. }

  75. public void requestRun()
  76. {
  77. synchronized(mWorkingThread)
  78. {
  79. mWorkingThread.notify();
  80. }
  81. }

  82. class WorkingThread extends Thread {

  83. public void run() {
  84. try {
  85. while(mCanDo)
  86. {
  87. if(mStop)
  88. {
  89. changeToWait();
  90. }
  91. synchronized(syncobj)
  92. {
  93. sleep(500);
  94. }
  95. Log.d(LOG_TAG, "WorkingThread in run");
  96. }

  97. } catch (Throwable t) {
  98. Log.d(LOG_TAG, "error happened==t:"+t.toString());
  99. }
  100. }
  101. };
  102. }
复制代码


原文链接:http://my.oschina.net/u/437275/blog/61107

举报

您需要登录后才可以回帖 登录 | 注册

关闭

江湖传闻

手机版|9RIA.com ( 京ICP备11007422号-2 

GMT+8, 2017-8-19 13:17 , Processed in 0.098153 second(s), 18 queries .

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部