线程安全:

在多线程的情况下,不会因为线程之间的操作而导致数据错误。


线程同步:

同一个资源,可能在同一时间被多个线程操作,这样会导致数据错误。这是一个现象,也是一个问题,而研究如何解决
此类问题的相关工作就叫做线程同步。

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中多线程开发的一些概念的更多相关文章

  1. Android学习笔记—Windows下NDK开发简单示例

    该示例假设Android开发环境已经搭建完成,NDK也配置成功: 1.在Eclipse上新建Android工程,名称为ndkdemo.修改res\layout\activity_main.xml &l ...

  2. Android学习笔记(一)开发环境搭建

    Android开发环境搭建 安装JDK 1.如果你还没有JDK的话,可以去这里http://www.oracle.com/technetwork/java/index.html ,接下来的工作就是安装 ...

  3. [Android学习笔记]ListView中含有Button导致无法响应onItemClick回调的解决办法

    转自:http://www.cnblogs.com/eyu8874521/archive/2012/10/17/2727882.html 问题描述: 当ListView的Item中的控件只是一些展示类 ...

  4. Android学习笔记_49_Android中自定义属性(attrs.xml,TypedArray的使用)

    做Android布局是件很享受的事,这得益于他良好的xml方式.使用xml可以快速有效的为软件定义界面.可是有时候我们总感觉官方定义的一些基本组件不够用,自定义组件就不可避免了.那么如何才能做到像官方 ...

  5. 2.1多线程(java学习笔记) java中多线程的实现(附静态代理模式)

    一.多线程 首先我们要清楚程序.进程.线程的关系. 首先进程从属于程序,线程从属于进程. 程序指计算机执行操作或任务的指令集合,是一个静态的概念. 但我们实际运行程序时,并发程序因为相互制约,具有“执 ...

  6. Android 学习笔记之使用多线程实现断点下载...

    PS:莫名其妙的迷茫... 学习内容: 1.使用多线程实现文件下载...   多线程下载是加快下载速度的一种方式..通过开启多个线程去执行一个任务..可以使任务的执行速度变快..多线程的任务下载时常都 ...

  7. android学习笔记----JNI中的c控制java

    面向对象的底层实现 java作为面向对象高级语言,可对现实世界进行建模.和面向过程不同的是面向对象软件的编写不是流程的堆积,而是对业务逻辑的多视角分解和分类.其过程大致为:      1).将知识分解 ...

  8. Android学习笔记----TimerTask中显示Toast的问题

    今天想在TimerTask的run函数中调用Toast显示一下提示信息,却总是导致程序崩溃.可是try语句块却又无法捕获到异常,代码如下: ...... Timer timer = new Timer ...

  9. Android学习笔记----Java中的字符串比较

    用习惯了C#.C++,在做字符串比较时想当然地使用如下语句: string str1 = "abcd", str2 = "abcd"; if(str1==str ...

随机推荐

  1. export和import实现模块化

    export和import实现模块化 阅读目录 ES6的模块化的基本规则或特点: 下面列出几种import和export的基本语法: ES6导入的模块都是属于引用: 循环依赖的问题: 浏览器兼容: 参 ...

  2. 在OpenShift平台开发Node.js程序

    设置process.env方便本地调试 --------------------- 修改~/.profile,增加下面两行,然后执行`. ~/.profile`: export OPENSHIFT_N ...

  3. 获取证书以用于 Windows Azure 网站 (WAWS)

    编辑人员注释:本文章由 Windows Azure 网站团队的项目经理 Erez Benari 撰写. 近年来,随着网络犯罪的上升,使用 SSL 保护网站逐渐成为一项备受追捧的功能,Windows A ...

  4. 基于visual Studio2013解决C语言竞赛题之0614递归大元素

     题目 解决代码及点评 /************************************************************************/ /* 14. 编一个程 ...

  5. [Boost]boost的时间和日期处理-(2)时间的操作

    <开篇> 本篇紧接着boost上篇叙述Boost::DateTime的时间处理.在C++中,常见的时间有time_t, FILETIME和tm,而boost中用ptime. 构造ptime ...

  6. 分析内存使用情况 (JavaScript)

    [此文档是初定版,随时可能进行更改.] JavaScript 内存分析器在 Visual Studio 2012 更新 1 和 Visual Studio 2013 中提供,旨在帮助你了解内存使用量和 ...

  7. PHP - 类库

    常用的PHP类库,PHP开发者必备[转] PHP开发者常用的PHP类库和组件 PDF 生成器 FPDF - 这量一个可以让你生成PDF的纯PHP类库. Excel 相关 你的站点需要生成Excel?没 ...

  8. Ch04 充满动作的控制器

    4.1  考察控制器和动作 4.1.1  IController与控制器基类 4.1.2  如何形成动作方法 4.2  哪些应该放在动作方法中 4.2.1  手动映射视图模型 4.2.2  输入验证 ...

  9. 安全威胁无孔不入:基于Linux系统的病毒(转)

    虽然在Linux里传播的病毒不多,但也是存在一些.我从一些安全网站搜集了一些资料. 1.病毒名称: Linux.Slapper.Worm 类别: 蠕虫 病毒资料: 感染系统:Linux 不受影响系统: ...

  10. Github-Client(ANDROID)开源之旅(四) ------ 简介Roboguice

    Guice是Google开发的一个轻量级,基于Java5(主要运用泛型与注释特性)的依赖注入框架(IOC),Guice非常小而且快.Guice是类型安全的,它能够对构造函数,属性,方法(包含任意个参数 ...