现在的位置: 首页 > 综合 > 正文

Android中的多线程的应用

2013年01月14日 ⁄ 综合 ⁄ 共 3293字 ⁄ 字号 评论关闭

多线程的概念:

多线程指在单个程序中中可以运行多个同的线程,执行不同的任务,多线程意味着程序的多行语句可以看上去几乎在同一时间运行。

线程与进程的相似之处。线程是一段可以完成特定功能的代码,是程序中单个顺序的流控制,但与进程不同的是,同类的线程共享一块内存空间和一组系统资源,所以系统在各个系统之间切换的时候资源占用比进程少的多,正因为如此,线程被称为轻量级进程,一个进程可以包含多个线程

java 中的线程:

java 中的线程由java.lang.thread 类,当生成一个Thread对象的时候,一个新的线程就产生了,java中的每个线程都是通过特定的Thread对象的run方法来实现其操作的,方法run称为线程体

public Thread()

public Thread(Runnable runnable)

public Thread(Runnable runnable,String name)

public Thread(String name)

 参数runnable 是一个实现了Runnable接口的实例,他的作用是实现了Runnable 的run方法,目标runnable可以为null表示由本身实例来执行线程,name参数为指定线程名称但没有指定线程的构造方法,线程的名称由JVM分配的。

1.java中实现线程的方式

在java中实现线程由两种方法:一种是继承线程类的Thread,一种是实现Runnable接口

public class chapter8_1 extends Thread {

    boolean isRunning = true;

    int timer = 0;

    /**
     * 线程体代码
     */
    @Override
    public void run() {
        while (isRunning) {
            try {
                Thread.currentThread().sleep(1000);
                timer++;
                System.out.println("逝去了 "+timer+" 秒");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    
    public static void main(String[] args) {

        chapter8_1 t1 = new chapter8_1();

        t1.start();
        System.out.println("计时器启动...");
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        try {
            String line = br.readLine();
            if (line.equalsIgnoreCase("1")) {
                t1.isRunning = false;
                /*t1.stop();*/
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    }

在main方法中new chapter8_1创建新的子线程,并且通过t1,start()启动子线程,main方法所在的为子线程,主线程负责管理其他的子线程

子线程启动之后就开始调用run方法,run方法是一个线程体,我们在子线程中处理事情就是在这里编写代码实现

Android中的多线程

在android中多线程应用的非常的广泛,在UI更新,游戏更新界面,和耗时处理,网络请求上面等都需要多线程

主线程与子线程的职责,主线程的职责是创建,显示,更新UI控件,子线程的职责是计算逝去的时间和与主线程发送更新UI的通知,而不是直接更新UI

主线程的职责是,显示UI,处理UI事件,启动子线程,停止子线程,更新UI,子线程如何发送通知,通知告诉主线程更新UI,线程之间的通信是如何进行的

在android中线程通信有两个对象,Message(消息)MessageQueue(消息队列)可以实现线程之间的通信

public class chapter8_4 extends Activity {

    private String TAG = "chapter8_3";
    private Button btnEnd;
    private TextView labelTimer;
    private Thread clockThread;
    private boolean isRunning = true;
    private Handler handler;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        btnEnd = (Button) findViewById(R.id.btnEnd);
        btnEnd.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                isRunning = false;
            }
        });

        handler = new Handler() {

            @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                case 0:
                    labelTimer.setText("逝去了 " + msg.obj + " 秒");
                }
            }

        };

        labelTimer = (TextView) findViewById(R.id.labelTimer);

        /* 线程体是Clock对象本身,线程名字为"Clock" */
        clockThread = new Thread(new Runnable() {
            @Override

            public void run() {
                int timer = 0;
                while (isRunning) {
                    try {
                        Thread.currentThread().sleep(1000);
                        timer++;
                        /* labelTimer.setText("逝去了 " + timer + " 秒"); */
                        Message msg = new Message();
                        msg.obj = timer;
                        msg.what = 0;
                        handler.sendMessage(msg);
                        Log.d(TAG, "lost  time " + timer);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });

        clockThread.start(); /* 启动线程 */

    }

有时候为了代码的紧凑,会把线程的创建和启动写在一条语句中,如下:

new Thread() {
        @Override
        public void run() {
            int timer = 0;
            while (isRunning) {
                ry {
                    Thread.currentThread().sleep(1000);
                    timer++;
                    / labelTimer.setText("逝去了 " + timer + " 秒");
                    Message msg = new Message();
                    msg.obj = timer;
                    msg.what = 0;
                    handler.sendMessage(msg);
                    Log.d(TAG, "lost  time " + timer);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }
    }.start();

第一份代码的虽然晦涩难懂,而且违背了javav的编程规范,程序结构也比较混乱,但是确实android的习惯写法,这主要是源于android追求减少字节码的追求

转载自:http://software.intel.com/zh-cn/articles/android-0/?utm_campaign=CSDN&utm_source=intel.csdn.net&utm_medium=Link&utm_content=%20intelandroid%20%E2%80%93%20duoxianchengutm_campaign=CSDN&utm_source=intel.csdn.net&utm_medium=Link&utm_content=%20intelandroid%20%E2%80%93%20duoxiancheng


抱歉!评论已关闭.