您的位置:首页 > 编程语言 > Java开发

JAVA中的线程(二)

2016-04-06 15:05 363 查看
本篇继续记录JAVA中线程的一些知识点。

线程的同步:

即线程在共享数集上的互斥与协作。

1、互斥(同步代码块、同步方法)

线程互斥是保证多线程在共享数据集上顺序执行。同步代码块和同步方法是保证线程在共享数据集上顺序执行的一种手段,都是在共享数据集上加上了对象锁,对非静态的同步方法默认对象锁为this,对于静态方法默认对象锁为方法所在类的类对象“类名.class”,同步代码块的对象锁由自己指定。

2、协作(线程通讯)

线程协作是建立在线程互斥的基础上,然后调用对象锁的wait,notify,notifyAll方法实现线程之间的交互(通讯)。

注意:(1)wait,notify,notifyAll方法必须应用在同步代码块或同步方法中。

(2)wait,notify,notifyAll方法必须由对象锁调用

Android中线程的应用机制:

1、所有UI操作,事件处理操作都在主线程(UI线程)执行。

2、所有耗时操作在工作线程执行。

Handler机制:

1、handler运行机制:如下图所示



多个工作线程操作同一个handler实例。通过调用handler的方法向handler的消息队列中添加消息对象。

主线程在消息队列中添加了消息后将会使用Handler中的Looper对象轮训该消息队列。

Handler调用handleMessage方法处理每个消息对象,我们需要重写handler的handlerMessage方法在主线程处理工作线程发来的消息对象更新UI。

Message

该类型用于描述一个消息。

该消息中含有很多属性字段,例如:

— what (int) :使用一个整数表示自定义消息类型

— obj (Object):该消息所携带的数据。

Message实例常用于工作线程耗时代码做完后,封装消息对象,并且把消息对象发送给主线程,让主线程处理该消息。消息对象中包含消息类型与数据。

MessageQueue

该类型用于描述一个消息队列。

该消息队列中维护一个消息集合,该集合元素先进先出。

MessageQueue对象提供了各种方法对消息队列进行操作。如:向队列中添加一个消息、从队列中获取下一个消息、移除一个消息。

MessageQueue在android中由主线程维护,在与Looper的配合下完成轮询消息队列的操作。

Looper

该类型用于描述一个消息队列轮循者。

一个Looper对象中维护一个MessageQueue消息队列对象,Looper的工作就是不断地轮循消息队列中的Message对象。

Looper.prepare()为当前县城创建Looper实例,并且与当前线程绑定在一起存入ThreadLocal。

Looper.myLooper() 获取与当前线程绑定在一起的Looper实例。

loop() 开始轮循消息队列。

Handler

我们可以把Handler理解为一种异步回调机制,Handler中包含有一个Looper对象,自然也就可以访问Looper中的消息队列。工作线程在耗时任务完成后把消息对象交给Handler,由Handler交给消息队列,通知Looper轮循该消息队列,轮循的过程在主线程中完成。

Looper在处理消息对象时将会调用handler的HandleMessage方法,我们只要重写该方法就可以实现在主线程中处理工作线程发送的消息对象的业务。

Handler的用法:

工作线程:执行耗时代码。创建Message消息对象,并且为属性赋值。调用handler的方法给主线程发送消息。

主线程:为handler实例化时重写handlerMessage方法,并且提供处理消息业务逻辑。

创建Message对象1:

Message msg = new Message();

创建Message对象2(先从池中取,没有再创建):

Message msg = Message.obtain();

handler.sendMessage(msg); 调用Handler的方法发送Message。

handler.sendEmptyMessage(what); 调用Handler的方法发送只有what属性的Message。

调用handler的post方法向消息队列中添加任务:

handler.post(new Runnable(){

public void run(){

}

});

调用handler的postDelay方法向消息队列中添加延迟执行的任务:

// 延迟3秒执行任务

handler.postDelayed(new Runnable(){

@override

public void run(){

}

}, 3000);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: