一、Android线程的定义和特点

    1.什么是线程:

        线程是一种轻量级进程,大多数情况下用于执行异步操作。在一个Android 程序开始运行的时候,会单独启动一个进程,同时会产生一个UIThread线程(main线程)。一个Android 程序默认情况下也只有一个Process,但一个Process下却可以有许多个Thread。

    2.线程与进程的区别:

        (1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;
        (2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
        (3)线程是处理器调度的基本单位,但进程不是.
         (4)线程只需要很少的资源就可“轻装上阵”运行的优点,来弥补进程并发的“颗粒度”粗糙的缺点,提高系统资源(如:CPU,内存——又可分为数据区,堆栈区等等,和IO总线控制权……)利用率。

二、为什么要用线程?
    1.用于异步操作。
    2.默认的情况下,Service和Activity(还有Content Provider和Broadcast Receiver)会同时运行在进程的main线程中,是会相互阻塞的。因此要在服务中执行长时间的操作(如网络应用)时,还是要自己创建线程来操作。

三、线程的实现方法

     1.继承Java.lang.Thread类,重载它的run()方法,用start()函数来启动线程:

Thread thread=new Thread(new Runnable()          {              @Override              public void run()              {                  Log.e("1111", "111111111");                  // TODO Auto-generated method stub                  Message message=new Message();                  message.what=1;                  mHandler.sendMessage(message);              }          });          thread.start();  

    2.实现Runnalbe接口,重载它的run()方法,用start()函数来启动线程

public class Title_Change_Demo extends Activity implements Runnable  {      public Button button;      public LinearLayout my_layout;            public Handler mHandler=new Handler()      {          public void handleMessage(Message msg)          {              switch(msg.what)              {              case 1:                  button.setText(R.string.text2);                  break;              default:                  break;                        }              my_layout.invalidate();              super.handleMessage(msg);          }      };            /** Called when the activity is first created. */      @Override      public void onCreate(Bundle savedInstanceState)      {          super.onCreate(savedInstanceState);          setContentView(R.layout.main);                    button=(Button)findViewById(R.id.button);          my_layout=(LinearLayout)findViewById(R.id.my_layout);                    Thread thread=new Thread(this);          thread.start();      }            @Override      public void run()      {          Log.e("ok", "111111111");          // TODO Auto-generated method stub          Message message=new Message();          message.what=1;          mHandler.sendMessage(message);      }  }  


   

   
   
      

    3.既然说的是Android,我们不得不提到的是AsyncTask      AsyncTask是Android框架提供的异步处理的辅助类,它可以实现耗时操作在其他线程执行,而处理结果在Main线程执行。使用他你会发现你的代码很容易被理解,因为他们都有一些具有特定职责的方法,尤其是AsyncTask,有预处理的方法onPreExecute,有后台执行任务的方法doInBackground,有更新进度的方法publishProgress,有返回结果的方法onPostExecute等等。不过封装越好越高级的API,对初级程序员反而越不利,就是你不了解它的原理。当你需要面对更加复杂的情况,而高级API无法完成得很好时,你就杯具了。

         

三、那么,继承Thread类与实现Runnable接口有什么区别?优缺点?

  1.首先,我们不妨看一下Java的API,如下图。我们发现Thread是实现了Runnable接口

    

  2.在Java中,类仅支持单继承,也就是说,当定义一个新的类的时候,它只能扩展一个外部类.

  如果自定义线程类继承自Thread,那么它无法再继承其他类,拥有其他类的方法,降低了类的扩展性。但是,如果通过实现Runnable接口,你就可以继承其他类了。

  3.还有一点最重要,就是使用实现Runnable接口的方式创建的线程可以处理同一资源,从而实现资源的共享:

   比如模拟一个火车站的售票系统,假如只有100张火车篇,且允许所有窗口卖这100张票,那么每一个窗口也相当于一个线程,但需要处理的资源是同一个资源,即100张车票。如果还用前面的方式来创建线程显然是无法实现的,这种情况该怎样处理呢?看下面这个程序:

    public class MutliThreadDemo {          public static void main(String[] args) {              MutliThread m=new MutliThread();               Thread t1=new Thread(m);               Thread t2=new Thread(m);               Thread t3=new Thread(m);               t1.start();               t2.start();               t3.start();           }      } 

   public class MutliThread implements Runnable{           private int ticket=100;//每个线程都拥有100张票           public void run(){               while(ticket>0){                   System.out.println(ticket--+" is saled by "+Thread.currentThread());               }           }       } 
    

 程序在内存中仅创建了一个资源,而新建的三个线程都是基于访问这同一资源的,并且由于每个线程上所运行的是相同的代码,因此它们执行的功能也是相同的。可见,如果现实问题中要求必须创建多个线程来执行同一任务,而且这多个线程之间还将共享同一个资源,那么就可以使用实现Runnable接口的方式来创建多线程程序。这样一来,线程、代码和数据资源三者有效分离,很好地体现了面向对象程序设计的思想。因此,几乎所有的多线程程序都是通过实现Runnable接口的方式来完成的。

// 如果觉得不错,记得顶我哦! 顶我!顶我!顶我!

更多相关文章

  1. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  2. 一款霸榜 GitHub 的开源 Linux 资源监视器!
  3. android log 分析(一)
  4. Android学习笔记——从源码看Handler的处理机制
  5. android三个特殊的资源目录 /res/xml /res/raw 和 /assets
  6. Android之Activity生命周期的浅析(二)
  7. android Service服务
  8. gdb+gdbserver调试android的so文件
  9. Android世界第一个activity启动过程

随机推荐

  1. Android使用getIdentifier()方法根据资源
  2. 让你的代码减少三倍!使用kotlin开发Androi
  3. Android(安卓)电量分析之Battery Histori
  4. Android(安卓)6.0运行时权限 (危险权限)
  5. android自定义大小对话框
  6. Android原生(Native)C开发之六:libpng移植
  7. Android+本地记事本(上)------实现登陆注
  8. Android(安卓)PinyinIME Debug 调试
  9. Android(安卓)MatrixCursor的详解
  10. adb shell 查看系统属性(用来判断特殊的操