[Android学习笔记]Android中多线程开发的一些概念
线程安全:
在多线程的情况下,不会因为线程之间的操作而导致数据错误。
线程同步:
同一个资源,可能在同一时间被多个线程操作,这样会导致数据错误。这是一个现象,也是一个问题,而研究如何解决
此类问题的相关工作就叫做线程同步。
android中,处理线程同步的手段就是:锁
一般分为公平锁和非公平锁:
synchronized(内部锁,互斥锁):
synchronized是JVM提供的线程同步机制,如果出现问题,JVM能捕获异常,并释放资源,具体实现机制需要查看JVM源码
synchronized的使用特点:
lock接口:
这些实现了lock接口的锁定义是通过java语言进行实现与封装的,具体的实现机制可以通过查看其源代码得知
lock实例加锁和解锁的大概过程:
当一个资源被锁定之后,访问它的线程会被加入等待队列,当
内部锁(互斥锁)ReentrantLock
读写锁
synchronized
1.synchronized作用在方法上:锁对象
2.synchronized作用在代码块:只锁代码块
3.synchronized(this):对象锁
4.synchronized(object):成员锁
总结synchronized:
可以锁对象:synchronized(this) , synchronized(class) , synchronized methods , 此时对象的所有
资源不能被其他线程访问
成员锁:
synchronized(obj){ } , 代码段内的代码不能被同时访问。
对象锁太粗糙
通常情况使用synchronized就够了,资源竞争很激烈的情况下,Synchronized的性能会下降几十倍,才会使用
ReetrantLock来完成复杂的业务需求。(不公平锁)
使用java封装的锁对象可以更灵活的满足业务需求,比如可以设定锁的等待时间,公平性等等,而使用Synchronized
则只能使用同步监视器的三个方法来操作线程
线程通讯:
synchronized作为对象锁时候,通过this,可以调用三个方法在线程之间通讯
synchronized作为成员所时候,通过(obj),调用三个方法,其中被锁的东西就叫做同步监视器。(this,obj)
wait:当前线程进入等待状态,直到其他线程调用该同步监视器的notity方法或者notityall方法来唤醒.
调用wait就以为着释放同步监视器
notify:唤醒在此同步监视器上等待的单个线程。如果所有线程都在此同步监视器上等待,则会随机选择唤醒其中一个线程。
只有当前线程放弃对该同步监视器的锁定后(用wait方法),才可以执行被唤醒的线程
notityAll: 唤醒在此同步监视器上等待的所有线程。只有当前线程放弃对该同步监视器的锁定后,才能执行唤醒的线程。
线程模型:
消息循环
消息队列
handler
Thread
UI Thread
android的线程模型:
UI线程有一个消息队列,一个消息循环,一个Handler.
一般建立的后台线程对象就是一个一次性完成工作的任务.
如何建立他们之间的联系?
一般情况下,启动一个非UI线程用于处理耗时工作之后,需要一个机制用于通知UI线程,工作做好了,
这个机制就是一个Message。
当后台线程工作结束之后,向欲通知的线程发送一个Message,用来通知这个目标线程说:“我已经工作完了”,而这个
Message怎么发过去呢?通过Handler对象。 想给哪个线程发送Message就给该线程的Handler发送Message.
(前提是目标线程有处理消息的能力)
综上:
当后台线程完成工作之后,会通过UI线程的Handler对象发送一个Message到UI线程的消息队列中,UI线程的消息循环
就会从消息队列中取出此Message,并且处理此Message,做爱做的事。
对于一个后台线程:
如果想让该 线程具有消息队列和消息循环,需要在线程中首先调用Looper.prepare()来创建消息队列,然后调用Looper.loop()进入消息循环。 如下例所示:
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
}
}
这样你的线程就具有了消息处理机制了,在Handler中进行消息处理。
[Android学习笔记]Android中多线程开发的一些概念的更多相关文章
- Android学习笔记—Windows下NDK开发简单示例
该示例假设Android开发环境已经搭建完成,NDK也配置成功: 1.在Eclipse上新建Android工程,名称为ndkdemo.修改res\layout\activity_main.xml &l ...
- Android学习笔记(一)开发环境搭建
Android开发环境搭建 安装JDK 1.如果你还没有JDK的话,可以去这里http://www.oracle.com/technetwork/java/index.html ,接下来的工作就是安装 ...
- [Android学习笔记]ListView中含有Button导致无法响应onItemClick回调的解决办法
转自:http://www.cnblogs.com/eyu8874521/archive/2012/10/17/2727882.html 问题描述: 当ListView的Item中的控件只是一些展示类 ...
- Android学习笔记_49_Android中自定义属性(attrs.xml,TypedArray的使用)
做Android布局是件很享受的事,这得益于他良好的xml方式.使用xml可以快速有效的为软件定义界面.可是有时候我们总感觉官方定义的一些基本组件不够用,自定义组件就不可避免了.那么如何才能做到像官方 ...
- 2.1多线程(java学习笔记) java中多线程的实现(附静态代理模式)
一.多线程 首先我们要清楚程序.进程.线程的关系. 首先进程从属于程序,线程从属于进程. 程序指计算机执行操作或任务的指令集合,是一个静态的概念. 但我们实际运行程序时,并发程序因为相互制约,具有“执 ...
- Android 学习笔记之使用多线程实现断点下载...
PS:莫名其妙的迷茫... 学习内容: 1.使用多线程实现文件下载... 多线程下载是加快下载速度的一种方式..通过开启多个线程去执行一个任务..可以使任务的执行速度变快..多线程的任务下载时常都 ...
- android学习笔记----JNI中的c控制java
面向对象的底层实现 java作为面向对象高级语言,可对现实世界进行建模.和面向过程不同的是面向对象软件的编写不是流程的堆积,而是对业务逻辑的多视角分解和分类.其过程大致为: 1).将知识分解 ...
- Android学习笔记----TimerTask中显示Toast的问题
今天想在TimerTask的run函数中调用Toast显示一下提示信息,却总是导致程序崩溃.可是try语句块却又无法捕获到异常,代码如下: ...... Timer timer = new Timer ...
- Android学习笔记----Java中的字符串比较
用习惯了C#.C++,在做字符串比较时想当然地使用如下语句: string str1 = "abcd", str2 = "abcd"; if(str1==str ...
随机推荐
- Java开发中常见的危险信号(上)
本文来源于我在InfoQ中文站原创的文章,原文地址是:http://www.infoq.com/cn/news/2013/12/common-red-flags-in-java-1 Dustin Ma ...
- Java 使用JDBC、DBCP、C3P0访问数据库
JDBC: Connection conn = null; Statement stmt = null; ResultSet rs = null; // 1.加载驱动 try { Class.forN ...
- SSH-Struts(一)——基本原理
简单介绍 Struts框架是MVC的一个实现,它非常好的结合了JSP.Servlet.JavaBean.Taglib等技术.它为MVC的各层提供了良好的支持,就像房地产商盖房子时先盖的大楼框架. 仅仅 ...
- Swift - 使用HTML5进行iOS开发(将HTML5打包成iOS应用)
最近越来越流行使用HTML5进行跨平台应用开发,先不说运行效率如何.从人力成本来说,只要写一套html页面就可以打包发布到安卓和iOS等多个平台,确实会省下不少时间和人力(这个领导最喜欢了). 下面简 ...
- asp.net导出Excel类库
using System; using System.Collections.Generic; using System.Reflection; using System.Web; using Exc ...
- inner join、left join、right join中where和and的作用
inner join.left join.right join中where和and的作用 .内连接(自然连接): 只有两个表相匹配的行才能在结果集中出现 2.外连接: 包括 (1)左外连接 (左边的 ...
- perl学习(8) 控制:unless,until,next,redo,last
Perl中实现了所有C 的操作符! Perl力求代码最少! 1.1.unless unless的含义是:除非条件为真,否则执行块中的代码,和if正好相反 unless($fred=~ /^[A-Z_] ...
- 【Android】自己定义控件——仿天猫Indicator
今天来说说类似天猫的Banner中的小圆点是怎么做的(图中绿圈部分) 在学习自己定义控件之前,我用的是很二的方法,直接在布局中放入多个ImageView,然后代码中依据Pager切换来改变图片.这样的 ...
- Response.AppendCookie
//写入 protected void Button2_Click(object sender, EventArgs e) { HttpCookie cookie=new HttpCookie(&qu ...
- 基于visual Studio2013解决C语言竞赛题之1051数的顺序
题目 解决代码及点评 /* 功能:自然数N一般写成如下形式: N=d[k]d[k-1]d[1] (d[1]-d[k] 均是十进制数字) 如果d[i+1]>d[i] (i=k-1 ...