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 } }
相关文章推荐
- 伪分布重新格式化hdfs
- 【游戏客户端开发】 IOS开发——Swift基础篇2
- LVS/DR结合keepalived
- iOS-异或加密
- Android自定义控件--圆形进度条(中间有图diao)
- 0115版本升级
- 0115界面编写规范化
- 0116android错误总结
- Autodesk 应用程序商店发布活动第二季开始了!
- Seaweed-FS综合使用测试
- C/C++ debug(三)
- 获取系统联系人信息
- android程序编写规范化
- HttpURLConnection详解
- 【游戏客户端开发】 IOS开发——Swift和Objective-C交互时的一些注意点
- LeetCode#213. House Robber II
- 蓝桥杯 历届试题 剪格子(记忆化搜索)
- 判断手机联网状态和及时修改提示
- 获取系统联系人信息
- Mac OS X 开启Http Ftp服务