您的位置:首页 > 其它

0116Runnable&&Thread的异同点&&Handler

2016-03-16 12:19 330 查看

Runnable && Thread的异同点

相同点:

继承Thread类和实现Runnable都可以实现多线程,但在实际开发中大多使用Runnable方法。

不同点:

表现形式:Runnable是实现接口,Thread是继承方法;

实质区别:Runnable适合于资源共享。

Runnable:

1.定义Runnable方法

public interface Runnable{
public void run();
}


2实现Runnable接口

package com.scau.mobilesafe.utils;

class MyThread implements Runnable {
private String name;

public MyThread(String name) {
this.name = name;
}

public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("线程开始:" + this.name + ",i=" + i);
}
}
};


实现了资源的共享

以卖票为例,Runnable接口的具体实现类MyThread内的run()方法,每个传入的姓名都能调用。

另外,Runnable类当被调用的时候就会开始运行run()方法,不需要和Thread一样需要start().

Thread

1.定义Thread类

package org.demo.dff;

class MyThread extends Thread {
private int ticket = 10;

public void run() {
for (int i = 0; i < 20; i++) {
if (this.ticket > 0) {
System.out.println("卖票:ticket" + this.ticket--);
}
}
}
};


2.每需要一个线程,需要实例化一个Thread方法。

package org.demo.dff;

public class ThreadTicket {
public static void main(String[] args) {
MyThread mt1 = new MyThread();
MyThread mt2 = new MyThread();
MyThread mt3 = new MyThread();
mt1.start();// 每个线程都各卖了10张,共卖了30张票
mt2.start();// 但实际只有10张票,每个线程都卖自己的票
mt3.start();// 没有达到资源共享
}
}


*个人总结*

Runnable和Thread最主要的区别,就是在能否共享数据,每实例化一个Thread,就能认为整个线程资源都是他的。所以在android里面多线程现在的时候,实例化多个线程任务的时候,需要将总体任务分割成多分,每个线程都是完成自己分得的这些下载任务,最后一个任务将最后无法分割的任务下载完全。

用卖票系统来解释,如果一个赛事的总体票数不变,开启多个线程买票,则每个线程都任务自己永远所有票的售卖权,比如说总计3000张票,3个子线程,则每个子线程都认为自己有3000张票的售卖权,实际上他们只有1000张的售卖权。这样就会导致线程不安全。

Runnable方法首先定义了一个run()方法,然后在实现接口的时候覆写run()方法时候将子线程中运行相关卖票过程。

因为卖票过程是在一个for循环当中进行,所以总的资源数量设置以后所有的线程都去这些资源当中取需要售卖的票。这样就不存在线程不安全的问题,所以在实际开发中,一般为了线程安全都会选择使用Runnable方法 来作为多线程操作。

Android中的Handler工作原理

一般情况下,在主线程中我们绑定了Handler,并在事件触发上面创建新的线程用于完成某些耗时的操作,当子线程中的工作完成之后,会对Handler发送一个完成的信号,而Handler接收到信号后,就进行主UI界面的更新操作。

个人总结

简而言之:当应用当中出现一些耗时操作时,为了避免程序假死现象,或者适当安排程序的运行顺序。在主程序当中绑定Handler

1.理解Handler首先要明白android的消息系统分成七大部分:



Handler的主要作用就是协调以上七大步骤运行的先后顺序。其中的Loop是最重要的(*还没有搞清楚*

以下以信息为例讲述handler做的消息分发机制

创建Handler实现类,在主UI所在类中的内部类

class MyHandler extends Handler {
public MyHandler() {
}
public MyHandler(Looper L) {
super(L);
}
// 重写handleMessage方法,接受数据并更新UI
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//此处根据msg内容进行UI操作
}
}


子线程的实现

class MyThread implements Runnable {
public void run() {
Message msg = new Message();
Bundle b = new Bundle();
b.putString("cmd", "update");
msg.setData(b);
MainActivity.this.myHandler.sendMessage(msg);//通知Handler更新UI
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: