经过

[Android]Thread线程入门1 和[Android]Thread线程入门2 的学习,我们对线程有了简单的了解。在实际应用中,一般都会用到多线程。很少像前面的例子这么简单。那么如何实现多线程呢?

我们稍微修改一下前面的例子。假设我们要同时运行4个线程。每个线程对应一个TextView。如下图所示:

每一个线程对应一个TextView。当点击Start Thread按钮,四个线程开始启动。对应的TextView分别加1.
Layout文件如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:orientation="vertical" >    
   <Button android:id="@+id/btnStart"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="Start Thread" />
   <Button android:id="@+id/btnStop"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="Stop Thread" />
   <TextView
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:textSize="30dip"
       android:textColor="#ffff0000"
       android:text="0"
       android:layout_marginLeft="30dip"
       android:id="@+id/txtShow1" />
   <TextView
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:textSize="30dip"
       android:textColor="#ffff0000"
       android:text="0"
       android:layout_marginLeft="30dip"
       android:id="@+id/txtShow2" />
   <TextView
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:textSize="30dip"
       android:textColor="#ffff0000"
       android:text="0"
       android:layout_marginLeft="30dip"
       android:id="@+id/txtShow3" />
   <TextView
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:textSize="30dip"
       android:textColor="#ffff0000"
       android:text="0"
       android:layout_marginLeft="30dip"
       android:id="@+id/txtShow4" />
</LinearLayout>

源代码如下:

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;
   //对应4个计数器
   private int mSecond1 = 0;
   private int mSecond2 = 0;
   private int mSecond3 = 0;
   private int mSecond4 = 0;
   
   private boolean mStop = false;
   
   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);
       
       mHandler = new MyHandler();
       //绑定TextView
       mTextView1 = (TextView)findViewById(R.id.txtShow1);
       mTextView2 = (TextView)findViewById(R.id.txtShow2);
       mTextView3 = (TextView)findViewById(R.id.txtShow3);
       mTextView4 = (TextView)findViewById(R.id.txtShow4);
       
       mButtonStart = (Button)findViewById(R.id.btnStart);
       mButtonStop = (Button)findViewById(R.id.btnStop);
       
       mButtonStart.setOnClickListener(new View.OnClickListener() {
           
           public void onClick(View v) {    
               //启动多线程
               startMultiThread();
           }
       });
       
       mButtonStop.setOnClickListener(new View.OnClickListener() {
           
           public void onClick(View v) {
               stopThread();
           }
       });
   }
   
   private void startMultiThread()
   {
       //启动4个线程
       new MyThread().start();
       new MyThread().start();
       new MyThread().start();
       new MyThread().start();
   }    
 
   private void stopThread()
   {
       mStop = true;    
   }    
 
   private class MyHandler extends Handler
   {
       @Override
       public void handleMessage(Message msg)
       {
           switch(msg.what)
           {
               case 1:
               {
                   //暂且第一个textview加1,其余textview不变
                   mTextView1.setText(Integer.toString(mSecond1++));
                   mTextView2.setText(Integer.toString(mSecond2));
                   mTextView3.setText(Integer.toString(mSecond3));
                   mTextView4.setText(Integer.toString(mSecond4));
                   break;
               }
           }
       }
   }
   
   private class MyThread extends Thread
   {
       @Override
       public void run()
       {
           Log.i("test", "threadid=" + this.currentThread().getId());
           while(!mStop)
           {    
               try
               {    
                   Thread.sleep(1000);
               }
               catch(InterruptedException e)
               {    
                   e.printStackTrace();
               }
               
               Message msg = new Message();
               msg.what = 1;
               //send message
               mHandler.sendMessage(msg);
           }
           
           if(mStop)
           {
               this.interrupt();
           }
       }
   }  
 
   
}

点击Start Thread按钮,是不是和我们设想的一样,第一个TextView加1,其余textView的数值不变呢?

观察上面图片,我们可以看到,数值并不是加1,明显是以加4的速度递增。为什么呢?
因此4个线程都在运行中,每个线程都对这个变量加1,所以我们就看到以4递增。那如何让变量还是以加1递增呢?我们修改代码如下:
private class MyHandler extends Handler
{
    @Override
    public void handleMessage(Message msg)
    {
        switch(msg.what)
        {
            case 1:
            {
                //mSecond ++; //second increase
                //显示传递出来的数字msg.arg1.而不再自己计数
                mTextView1.setText(Integer.toString(msg.arg1));
                mTextView2.setText(Integer.toString(msg.arg1));
                mTextView3.setText(Integer.toString(msg.arg1));
                mTextView4.setText(Integer.toString(msg.arg1));
                break;
            }
        }
    }
}

private class MyThread extends Thread
{
    //在线程里声明一个变量,用来计数
    private int mSecond = 0;
    @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();
            }
            //每隔1秒加1
            mSecond ++;
            //Log.i("test", "enter run 2");
            Message msg = Message.obtain();
            msg.what = 1;
            msg.arg1 = mSecond; //将数值传递出去
            //send message
            mHandler.sendMessage(msg);
        }
       
        if(mStop)
            this.interrupt();
    }
}

运行后就会发现四个TextView都是以加1的速度整齐划一的变换着。


这时候,我们希望每一个TextView都有自己的数字显示。那么应该如何实现呢?请看下篇博文。

转载于:https://www.cnblogs.com/Codenewbie/archive/2013/03/28/2986723.html

[Android]Thread线程入门3--多线程相关推荐

  1. Thread线程类及多线程

    1.进程.线程.并发.并行是什么? 1)进程:操作系统中可以运行多个任务(程序),这些运行的任务(程序)被称为进程.程序的运行产生进程(内存空间.程序执行的堆栈),可以这样说,进程是作为操作系统分配资 ...

  2. java线程入门_java多线程快速入门(一)

    1.什么是进程 比如:QQ.QQ游戏.eclipse都是进程,可以通过任务管理器查看进程 2.进程和线程区别 线程是进程的一部分,一个进程可以包含多个线程,一个线程只能属于一个进程 进程是所有线程的集 ...

  3. android thread线程通讯

    参考:http://codinghard.wordpress.com/2009/05/16/android-thread-messaging/ 下载链接 源码: package sample.thre ...

  4. android c++ 线程,Android多线程分析之二:Thread的实现

    Android多线程分析之二:Thread的实现在前文<Android多线程分析之一:使用Thread异步下载图像>中演示了如何使用 Thread 处理异步事务.示例中这个 Java Th ...

  5. 在Android中使用Handler和Thread线程执行后台操作

    在 Android中使用Handler和Thread线程执行后台操作 对于线程的控制,我们将介绍一个 Handler类,使用该类可以对运行在不同线程中的多个任务进行排队,并使用Message和Runn ...

  6. android异步线程未执行,关于多线程:当服务在后台运行时,Android异步任务无法正常运行(doInBackground未执行)...

    我注意到有时Async任务无法正常运行,实际上它的doInBackground()方法没有被调用,这种情况主要发生在该活动在后台运行任何服务时. 例如,当音乐在带有服务的后台运行时,Async任务不会 ...

  7. Android中使用Thread线程出现的问题

    很多初入Android或Java开发的新手对Thread.Looper.Handler和Message仍然比较迷惑,衍生的有HandlerThread.java.util.concurrent.Tas ...

  8. android java thread_Android中断并重启一个Thread线程的简单方法

    这里简单的总结下(大概思路,没调试,可能会有错!): MyThread.java pulbic class MyThread implemets Thread{ @overide public voi ...

  9. java5个线程_java基础thread——java5之后的多线程(浅尝辄止)

    承上启下 虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁,为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象Lock. 一.JD ...

最新文章

  1. avpicture_fill的实现
  2. 约束,索引,rownumrownum
  3. 【错误记录】Android 内存泄漏 错误排查记录 ( FinalizerReference 内存泄漏 )
  4. 【杂谈】有三AI专栏作者邀请,在这里写文章能获得什么,有什么不同?
  5. 26个音序的正确写法和占格_别让瞎练毁了健康,26个健身动作正误对比图,让我们正确健身...
  6. 逆向工程核心原理学习笔记(二):字符串检索法查找main函数
  7. 示例化讲解RIP路由更新机制
  8. Java虚拟机(三)——类加载子系统概述
  9. 在Release版本中如何关闭Debug版本中的log
  10. 科研绘图神器之Plotluck(如何节省时间)
  11. soc设计方法与实现_冷轧钢板局部激光热处理实现汽车轻量化设计新方法
  12. 企业信息化基本指标构成方案(试行)上
  13. Java核心技术 卷I 基础知识 学习笔记(1)
  14. 网站打开速度慢如何压缩图片_8个免费实用的图片压缩网站、软件(含下载地址)吐血推荐...
  15. 软件构造之java类图
  16. APP兼容性专项测试
  17. 数据结构 WSADATA
  18. 华为交换机dhcp获取不到_S7706交换机客户端无法通过DHCP获取地址问题
  19. 360影视大全 python_「www.dy2018.com」python爬取电影天堂(www.dy2018.com)所有视屏的所有链接 - 金橙教程网...
  20. 【图像识别】基于主成分分析算法实现人脸二维码识别matlab代码

热门文章

  1. AAA Password Expiry in Cisco IOS Easy***
  2. vue调试工具 -- vue-devtools 安装方法
  3. Hibernate -- hibernate.cfg.xml 核心配置文件
  4. Android零基础入门第31节:几乎不用但要了解的AbsoluteLayout绝对布局
  5. Word2013中制作按钮控件
  6. 带命名空间的XML的dom4j应用转
  7. Android开发,使用背景图(xml drawable)为view 设置边框
  8. Sql Server系列:键和约束
  9. CDialog中使用工具栏和状态栏
  10. C文件 写入 读取 函数