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

经过 

[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();
       }
   }  
}
posted @ 2013-03-28 14:52  Myna Wang  阅读(236)  评论(0编辑  收藏  举报
免费流量统计