实现多线程的方式

在Android系统里的线程分为有消息循环的线程和没有消息循环的线程。我们上一节介绍的应用程序主线程就是一个有消息循环的线程,而通过直接继承Thread类的线程是没有消息循环的线程,当然我们也可以通过在线程里调用Looper.prepare(),让系统为该线程建立一个消息队列。

下面我们介绍两种常用的多线程方式。

11.3.1  Thread

通过继承Thread类进行多线程编程是最简单的方式之一。

其基本步骤如下。

(1)继承Thead类生成其子类,并实现其run()方法,该方法就是我们需要线程完成其功能的地方,例如在run()里进行网上图片的下载。

(2)在活动Activity里相应的地方实例化Thread子类并调用start()运行线程。

(3)在线程运行过程中如果需要更新UI,则通过Activity的handler发送消息给主线程。

下面是线程示例。

Threadtest.java

1.   class Threadtest extends Activity {

2.   Handler handler = new Handler(){

3.   @Override

4.   public void handleMessage( Message msg ){

5.   if( msg.what == 0 ){

6.   msg.getData();

7.   //update ui

8.   }

9.   }

10.  };

在第2~10行,定了一个handler的消息处理函数,该handler直接绑定到主线程的消息循环上。当其他线程通过handler的sendMessage发送消息给主线程后,主线程的消息循环会派发消息给handleMessage函数处理消息,我们就在此处根据消息msg传来的数据进行相应的UI操作等动作。

11.  public void onCreate(Bundle savedInstanceState) {

12.  super.onCreate(savedInstanceState);

13.  ...

14.  t = new myThread();

15.  t .start();

16.  }

第14~15行是在Activity里实例化myThread类并运行。

17.  class myThread extends Thread{

18.  public void run() {

19.  ...

20.  Message msg = new Message();

21.  msg.what = 0;

22.  Bundle data=new Bundle();

23.  ...

24.  message.setData(data);

25.  handler.sendMessage(msg);

26.  }}}

第17~25行,我们的myThread继承自Thread,并实现了run()函数,在run()里进行相应的操作,例如去网上下载图片、MP3等。当完成任务后,我们通过构造一个新消息msg,把运行结果等数据放入msg,并通过上面的handler把消息发送给主线程。至此线程完成功能。

这个例子是个逻辑示例,在第2~10行,定了一个handler的消息处理函数,该handler直接绑定到主线程的消息循环上。当其他线程通过handler的sendMessage发送消息给主线程后,主线程的消息循环会派发消息给handleMessage函数处理消息,我们就在此处根据消息msg传来的数据进行相应的UI操作等动作。

第17~25行,我们的myThread继承自Thread,并实现了run()函数,在run()里进行相应的操作,例如去网上下载图片、MP3等。当完成任务后,我们通过构造一个新消息msg,把运行结果等数据放入msg,并通过上面的handler把消息发送给主线程。至此线程完成功能。

第14~15行是在Activity里实例化myThread类并运行。

11.3.2  AsyncTask

AsyncTask也是实现多线程的一种常用方式,它封装了一些方法方便我们维护线程,并可以解决一些线程安全问题。通过继承AsyncTask类来进行多线程编程,将使得UI thread编程变得非常简单。它不需要借助Handler即可实现UI更新。

其基本步骤如下。

(1)继承AsyncTask生成子类。

(2)实现AsyncTask中定义的下面一个或几个方法。

onPreExecute():该方法将在执行实际的后台操作前被主线程调用,我们可以在该方法中做一些准备工作。

doInBackground(Params...):将在onPreExecute方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台计算工作。可以调用publishProgress方法来更新实时的任务进度。该方法是子类必须实现的。

onProgressUpdate(Progress...):在publishProgress方法被调用后,主线程将调用这个方法从而在界面上展示任务的进展情况。

onPostExecute(Result):在doInBackground 执行完成后。onPostExecute 方法将被主线程调用,后台的计算结果将通过该方法传递到主线程。

这4个方法都不能手动调用,而且除了doInBackground(Params...)方法,其余3个方法都是被主线程所调用的,所以要求AsyncTask的实例必须在主线程中创建,AsyncTask.execute方法必须在主线程中调用。

下面是一个自定义AsyncTask类的示例。

1.   class MyAsyncTask extends AsyncTask {

2.   public MyAsyncTask(Activity mActivity) {

3.   super();

4.   //初始化工作;

5.   }

第2~5行是类的构造函数,我们可以通过此函数传递上下文等资源。

6.   @Override

7.   protected void onPreExecute() {

8.   //准备工作,主线程中执行

9.   super.onPreExecute();

10.  }

第7~10行onPreExecute函数,进行准备工作。

11.  @Override

12.  protected Object doInBackground(Object... params) {

13.  //执行后台操作,即另外的线程中执行

14.  return new Object();

15.  }

第11~15行doInBackground是后台线程部分,具体执行我们所需要做的工作代码。

16.  @Override

17.  protected void onPostExecute(Object result) {

18.  //doInBackground执行完进入该方法中,此时又回到主线程中

19.  }

第16~19行onPostExecute是执行完成后数据反馈部分。

20.  }

第2~5行是类的构造函数,我们可以通过此函数传递上下文等资源。

第7~10行onPreExecute函数,进行准备工作。

第11~15行doInBackground是后台线程部分,具体执行我们所需要做的工作代码。

第16~19行onPostExecute是执行完成后数据反馈部分。

时间: 2024-11-06 23:09:36

实现多线程的方式的相关文章

为什么Java中实现多线程的方式有两种?

在面试的过程中,我们经常问被面试者,为什么Java中实现多线程的方式有两种(一种是直接继承Thread类,一种是实现Runnable接口)?可惜的是,很多面试者都答不出来,甚至从来没有想为什么.,那么真正的原因是什么呢?我们可以用反证法推理一下: 假设Java只提供Thread供大家继承从而实现多线程,考虑下面的一个需求,如果有一个已经继承了某个父类的类,但是这个类又想实现多线程,怎么办?很显然,如果只提供一个可以继承的类,肯定解决不了这个问题.那么,如何解决,毫无疑问,就只能使用接口了.

实现多线程的方式Runnable

package com.thread.runnable; /** * 实现多线程的方式有继承Thread类和实现Runnable接口两种方式 * 哪种方式更好呢?实现的方式由于继承的方式. * 原因:1.避免了Java但继承的局限性 * 2.如果多个线程要操作同一份资源,实现接口的方式更适合 * @author Administrator * */public class TestRunnable { public static void main(String[] args) {// OddT

Java中有两种实现多线程的方式以及两种方式之间的区别

网上流传很广的是一个网上售票系统讲解.转发过来.已经不知道原文到底是出自哪里了. Java中有两种实现多线程的方式.一是直接继承Thread类,二是实现Runnable接口.那么这两种实现多线程的方式在应用上有什么区别呢? 为了回答这个问题,我们可以通过编写一段代码来进行分析.我们用代码来模拟铁路售票系统,实现通过四个售票点发售某日某次列车的100张车票,一个售票点用一个线程表示. 我们首先这样编写这个程序: Java代码    class ThreadTest extends Thread{

多线程实现方式---实现Runnable接口

一个类如果需要具备多线程的能力,也可以通过实现java.lang.Runnable接口进行实现.按照Java语言的语法,一个类可以实现任意多个接口,所以该种实现方式在实际实现时的通用性要比前面介绍的方式好一些. 使用实现Runnable接口实现多线程的示例代码如下: /** * 测试类 */ public class Test2 { public static void main(String[] args) { //创建对象 MyRunnable mr = new MyRunnable();

二、java实现多线程的方式?

一.同步?异步? 下面两幅图解释了同步异步. 二.实现多线程的方式 1.继承Thread package threaddemo; class CreateThreadDemo extends Thread{ /** * 线程执行的任务,执行的代码 */ @Override public void run() { for (int i = 0; i <30 ; i++) { System.out.println("我是线程:"+i+ "名字:"+Thread.c

多线程创建方式及线程安全问题

1.创建线程方式 一:  创建线程方式一继承Thread类 public clsss MyThread extends Thread{ //重写run方法,设置线程任务 Run(){ } } main(){ new MyThread().start(); } 获取线程名称: Thread.currentThread()获取当前线程对象 Thread.currentThread().getName();获取当前线程对象的名称 二:创建线程方式-实现Runnable接口 创建线程的步骤. 1.定义类

详解三种java实现多线程的方式

java中实现多线程的方法有两种:继承Thread类和实现runnable接口. 1.继承Thread类,重写父类run()方法 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public class thread1 extends Thread {    public void run() {        for (int i = 0; i < 10000; i++) {            System.out.println("我是线程"+

C++实现一个多线程同步方式的协同工作程序示例

多线程并发程序与协同程序其实是不同的概念.多线程并发是多个执行序同时运行,而协同程序是多个执行序列相互协作,同一时刻只有一个执行序列.今天想到的是将两者结合起来,拿现实生活中的例子来说,假设一个班级有100个学生,一个老师要批改100个学生的作业,有时老师太忙或者赶时间会叫几个同学帮忙批改,等所有同学都批改完后都交到老师手中,老师在下次上课的时候将作业本一起发给班上的学生....其实在并发编程的时候也可以借鉴这一个思想和模式,特别是网络服务器开发的过程中,并发与协同经常出现,于是今天写了一个简单

Swift - 多线程实现方式(2) - NSOperation和NSOperationQueue

1,Swift继续使用Object-C原有的一套线程,包括三种多线程编程技术: (1)NSThread (2)Cocoa NSOperation(NSOperation和NSOperationQueue) (3)Grand Central Dispath(GCD) 2,本文着重介绍Cocoa NSOperation Cocoa NSOperation不需要关心线程管理和数据同步的事情,可以把精力放在自己需要执行的操作上.相关的类有NSOperation和 NSOperationQueue.其中N

C#实现多线程的方式:使用Parallel类

简介 在C#中实现多线程的另一个方式是使用Parallel类.  在.NET4中 ,另一个新增的抽象线程是Parallel类 .这个类定义了并行的for和foreach的 静态方法.在为 for和 foreach定 义的语言中,循环从一个线程中运行 .Parallel类使用多个任务,因此使用多个线程来完成这个作业.  我们在前文中,对任务作出了一定的阐释,有兴趣的朋友可以前去查看.  Parallel.For()和 Parallel.ForEach()方法多次调用同一个方法,而 Parallel