[Android]Thread线程入门4--多线程

原创 2013年12月06日 10:14:41

经过 

[Android]Thread线程入门3--多线程 的学习,我们了解了多线程的简单概念。那么如何实现真正的多线程,让每个线程都干自己的活,互不影响呢?
看下图:

图片上有4个TextView,他们各自显示着不同的数字。
第一个起始数字是0,加1递增。
第二个起始数字是100,加1递增。
第三个起始数字是1000,加10递增。
第四个起始数字是10,加5递增。
这是如何实现的呢?
Layout布局和大部分代码和[Android]Thread线程入门3--多线程一样的。
源代码如下:
public class TestThreadActivity extends Activity {
   private MyHandler mHandler = null;;
   //4个用来显示数字的TextView
   private TextView mTextView1;
   private TextView mTextView2;
   private TextView mTextView3;
   private TextView mTextView4;
   
   private Button mButtonStart;
   private Button mButtonStop;
   
   //用来存储TextView。
   private ArrayList<TextView> lstTextView = new ArrayList<TextView>();
   
   private boolean mStop = false;
   
   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);
       
       mHandler = new MyHandler();
       
       mTextView1 = (TextView)findViewById(R.id.txtShow1);
       mTextView2 = (TextView)findViewById(R.id.txtShow2);
       mTextView3 = (TextView)findViewById(R.id.txtShow3);
       mTextView4 = (TextView)findViewById(R.id.txtShow4);
       //将TextView存储到一个列表里。这种设计比较难看。呵呵。仅仅是举例而已。
       lstTextView.add(0, mTextView1);
       lstTextView.add(1, mTextView2);
       lstTextView.add(2, mTextView3);
       lstTextView.add(3, mTextView4);
       
       mButtonStart = (Button)findViewById(R.id.btnStart);
       mButtonStop = (Button)findViewById(R.id.btnStop);
       
       mButtonStart.setOnClickListener(new View.OnClickListener() {
           
           public void onClick(View v) {
               //startThread();
               startMultiThread();
           }
       });
       
       mButtonStop.setOnClickListener(new View.OnClickListener() {
           
           public void onClick(View v) {
               stopThread();
           }
       });
   }
   
   private void startMultiThread()
   {
       //开启4个线程,每个线程的参数都不一样
       //开始数字为0,加1递增。用lstTextView[0]那个TextView来显示这个数字
       //即最上面那个TextView
       new MyThread(0,1, 0).start();        
       //开始数字为100,加1递增。用lstTextView[1]那个TextView来显示这个数字
       new MyThread(100,1, 1).start();        
       //开始数字为1000,加10递增。用lstTextView[2]那个TextView来显示这个数字
       new MyThread(1000,10, 2).start();        
       //开始数字为10,加5递增。用lstTextView[3]那个TextView来显示这个数字
       //即最下面那个TextView
       new MyThread(10,5, 3).start();        
   }    
     
   private void stopThread()
   {
       mStop = true;
   }    
   
   private class MyHandler extends Handler
   {
       @Override
       public void handleMessage(Message msg)
       {
           switch(msg.what)
           {
               case 1:
               {                    
                   //根据msg传递过来的参数,取出对应的TextView,用它来显示当前的数字
                   TextView tv = (TextView)lstTextView.get(msg.arg2);
                   tv.setText(Integer.toString(msg.arg1));                    
                   break;
               }
           }
       }
   }
   
   private class MyThread extends Thread
   {
       //起始数字
       private int mStartPos = 0;
       //当前数字
       private int mCurrentPos = 0;
       //以几递增
       private int mInterval = 0;
       //对应的TextView在lstTextView中的索引
       private int mTextViewIndex = 0;
       
       //初始化
       public MyThread(int nStartPos, int nInterval,int nTextViewIndex)
       {
           mStartPos = nStartPos;
           mInterval = nInterval;
           mCurrentPos = mStartPos;
           mTextViewIndex = nTextViewIndex;
       }
       
       @Override
       public void run()
       {
           Log.i("test", "threadid=" + this.currentThread().getId());
           while(!mStop)
           {    
               try
               {    
                   Thread.sleep(1000);
               }
               catch(InterruptedException e)
               {    
                   Log.e("test", "enter run exception:" + e.getLocalizedMessage());
                   e.printStackTrace();
               }
               //当前数字加递增量
               mCurrentPos += mInterval;
               //Log.i("test", "enter run 2");
               Message msg = Message.obtain();
               msg.what = 1;
               //将当前数字传递给message
               msg.arg1 = mCurrentPos;
               //将显示当前数字的TextView传递给message
               msg.arg2 = mTextViewIndex;
               //send message
               mHandler.sendMessage(msg);
           }
           
           if(mStop)
               this.interrupt();
       }
   }  
}

Android线程详解

现在大多数的移动设备已经变得越来越快,但是它们其实也不算是非常快。如果你想让你的APP既可以承受一些繁杂的工作而又不影响用户体验的话,那么必须把任务并行执行。在Android上,我们使用线程。 端一...
  • cswhale
  • cswhale
  • 2014年09月04日 15:54
  • 20553

Android开发之多线程的操作方式Thread,TimerTask,AsyncTask

Android游戏开发之多线程的操作方式 雨松MOMO原创文章如转载,请注明:转载至我的独立域名博客雨松MOMO程序研究院,原文地址:http://www.xuanyusong....
  • u011470899
  • u011470899
  • 2013年08月22日 10:35
  • 1483

C++使用thread类多线程编程

C++11中引入了一个用于多线程操作的thread类,简单多线程示例: #include #include #include using namespace std; void thread...
  • dcrmg
  • dcrmg
  • 2016年12月28日 20:23
  • 11862

Android多线程研究(8)——Java5中Futrue获取线程返回结果

我们先来看一下ExecutorService中的执行方法:在上一篇中我们使用了execute方法启动线程池中的线程执行,这一篇我们来看看submit方法的使用:submit提交一个返回值的任务用于执行...
  • lxq_xsyu
  • lxq_xsyu
  • 2014年06月08日 11:45
  • 2520

《探索C++多线程》:thread源码(一)

C++多线程支持库(Thread support library)
  • hujingshuang
  • hujingshuang
  • 2017年04月17日 17:47
  • 1248

多线程的用法#include<thread> (调用摄像头Demo)

多线程的使用方法,调用摄像头Demo
  • zmdsjtu
  • zmdsjtu
  • 2016年09月28日 08:58
  • 2568

WPF多线程演示

WPF中的几种处理线程的工作方式: 1.简单的DispatcherTimer类似Timer控件 2.需要处理UI同步时,Dispatcher DispatcherOpertion 3...
  • jumtre
  • jumtre
  • 2013年11月29日 19:12
  • 8970

【Java并发编程】之六:Runnable和Thread实现多线程的区别(含代码)

Java中实现多线程有两种方法:继承Thread类、实现Runnable接口,在程序开发中只要是多线程,肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下...
  • mmc_maodun
  • mmc_maodun
  • 2013年12月06日 10:15
  • 37142

Android线程操作类(暂停、重新开启、停止)

场景:  在程序中如果需要在后台长时间做一件事情,比如联网获取数据等操作,就要用到线程。  但为了提高用户体验,有以下几点需要注意:  1、程序可见时线程开始运行;  2、程序不可见时线程暂停...
  • luoyouren
  • luoyouren
  • 2016年08月05日 10:42
  • 2290

JAVA多线程之Runnable和Thread比较

在我们开发的过程中常常会碰到多线程的问题,对于多线程的实现方式主要有两种:实现Runnable接口、继承Thread类。对于这两种多线程的实现方式也是有着一些差异。既然实现了多线程那必然离不开管理这些...
  • u013755987
  • u013755987
  • 2016年07月11日 21:15
  • 8652
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[Android]Thread线程入门4--多线程
举报原因:
原因补充:

(最多只允许输入30个字)