线程通信(2)

消息分发

当Message对象被发送到Handler。并尝试被处理时。Handler会对消息进行分发,即决定由谁处理消息。

在消息机制中,能够有下面3种处理消息的方式:

【高优先级】在创建Message对象时,调用Message类的静态方法public static Message obtain(Handler h,Runnable callback),

指定callback參数,则由callback处理消息。

public void doSendMessage(View view){
		Message msg;
		Runnable callback = new Runnable(){
			@Override
			public void run() {
                System.out.println("高优先级");
			}
		};
		msg = Message.obtain(new Handler(),callback);
		msg.sendToTarget();
	}

【中优先级】在创建Handler对象时。调用public Handler(Callback callback)构造方法,指定callback,将由Handler.Callback接口中

定义的public boolean handleMessage(Message msg)方法处理消息。

     private Handler handler;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		handler = new Handler(new InnerHandlerCallback());
	}

	private class InnerHandlerCallback implements Handler.Callback{

		@Override
		public boolean handleMessage(Message msg) {
            System.out.println("中优先级");
			return false;
		}

	}
	public void doSendMessage(View view){
		Message msg;
		Runnable callback = new Runnable(){
			@Override
			public void run() {
                System.out.println("高优先级");
			}
		};
		msg = Message.obtain(handler);
		msg.sendToTarget();
	}

【低优先级】自己定义类继承Handler类,创建自己定义的Handler对象。并在自己定义类中

重写public void handleMessage(Message msg)方法,由重写的方法处理消息。

线程通信模型

因为向目标线程发送消息的线程可能比較多,为了确保目标线程

能收到这些消息。并逐一处理。在消息机制中,存在4种角色:

Message:消息的载体

Handler:发送消息、处理消息

MessageQueue:消息队列

Looper:消息队列的管理者

Handler用于运行消息的发出和处理

Handler关联一个独立的线程及消息队列。即Handler在哪个线程创建。则绑定到哪个

线程的消息队列。

MessageQueue是Message的容器,它是一个先进先出、后进后出的队列;

不论什么Message在被发出后,都会被先放到MessageQueue中。然后逐一的发送给目标。

Looper是MessageQueue的管理者

当Message被发出后。由Looper关联的MessageQueue.IdleHandler将其加入到MessageQueue中

Looper在工作时,会循环读取MessageQueue,然后实现消息的发送

MessageQueue是由Looper实现管理,英雌,开发者无需对它进行处理

Handler的创建线程决定了他所在的线程。则处理相应线程中收到的消息

每一个线程都能够有独立的Looper。由各个Looper管理各个线程的消息队列

Looper必须调用prepare()系列方法进行初始化,然后在调用loop()方法才会開始工作

每一个Handler在初始化之前。相应的线程中必须有匹配的Looepr,而主线程默认即存在已经启动的Looper

时间: 2024-08-27 12:50:20

线程通信(2)的相关文章

Java多线程编程核心技术读书笔记(3)-线程通信

线程是操作系统中独立的个体,但是这些个体如果无法经过特殊的处理就不能成为一个整体.线程间通信可以实现线程间的信息互换.相互唤起等功能,是系统的交互性更加强大,大大提高CPU的利用率,同时还能让开发者对各个线程任务有清晰的把控和监督,最常用的线程通信方法就是--等待/通知机制. 一.等待/通知机制 1.wait() / notify() 等待/通知机制在生活中比比皆是,例如:厨师/服务员的菜品传递台.生产者/消费者模式,JDK中通过Object里面的两个方法 wait() / notify() 来

java 线程通信

java 线程通信使用wait notify 配合synchronized 当线程执行wait()时,会把当前的锁释放,然后让出CPU,进入等待状态.当执行notify/notifyAll方法时,会唤醒一个处于等待该 对象锁 的线程,然后继续往下执行,直到执行完退出对象锁锁住的区域(synchronized修饰的代码块)后再释放锁. 如下代码: public class ThreadTest { //声明一个线程可视化的list集合 public static List<String> lis

线程通信

线程通信 一 使用Synchronized的线程 1.当线程在系统内运行时,线程的调度具有一定的透明性,程序通常无法准确控制线程的轮换执行,但java也提供了一些机制来保证线程协调运行.Object类提供了wait(),notify()和notifyAll()三个方法,这三个方法属于Object类,但是必须由同步监视器来调用,可以分为以下两种情况:(1)对于使用synchronized修饰的同步方法,因为该类的默认实例this就是同步监视器,所以可以在同步方法中直接调用这三个方法(2)对于使用s

Thinking in Java---再谈线程通信

前面写过一篇关于线程通信的博客,但是只是简单的罗列了几种线程通信的形式及语法:这几天又把<>上对应的内容看了一遍,这一篇博客主要结合几个例子说明下几种线程通信方式的特点. 首先还是要明确线程通信要解决的问题是什么:考虑这么一个情况,我们现在要对一台车进行涂蜡和抛光,并且在进行抛光之前一定要保证已涂蜡,且在涂另一层蜡的时候,又要保证已经抛光:现在我们我们开启两个线程,一个负责涂蜡,另一个负责抛光:要想顺利的完成任务,那么显然这两个线程需要相互等待和协调.这就是线程通信的任务了–如果我们有一个任务

java多线程 - 线程通信

当线程在系统内运行时,程序通常无法准确控制线程的轮换执行,但是可以通过一些机制来保证线程协调运行. 由同步监视器对象协调线程 实现这种功能可以借助于Object类提供的wait().notify().notifyAll()三个方法(注意,这三个方法属于Object类,不属于Thread类).这三个方法必须由同步监视器来调用,可以分为两种情况: 对于同步方法,同步监视器默认是当前实例(this),所以可以在同步方法中直接调用这三个方法: 对于同步代码块,同步监视器是synchronized后括号里

ZeroMq实现跨线程通信

ZeroMq实现跨线程通信 之前在技术崇拜的技术经理指导下阅读了ZeroMq的基础代码,现在就将阅读的心得与成果记录一下,并重新模仿实现了一下经理的异步队列. 1.对外接口 //主要接口(1)void *ymq_attach (void *ctx_, int oid, void* sink_); (2)void *ymq_detach (void *ctx_, int oid); (3)void *ymq_register_timer (void *ctx_, int oid, int time

iOS-----线程同步与线程通信

线程同步与线程通信 多线程是有趣的事情,它很容易突然出现”错误情况”,这是由于系统的线程调度具有一定的随机性造成的.不过,即使程序偶然出现问题,那么是由于编程不当所引起的.当使用多个线程来访问同一个数据时,很容易”偶然”出现线程安全问题. 线程安全问题 关于线程安全问题,有一个经典的问题:银行取钱的问题.银行取钱的基本流程基本可以分为如下几个步骤. 用户输入账户.密码.系统判断用户的账户.密码是否匹配. 用户输入取款金额. 系统判断账户余额是否大于取款金额. 如果余额大于取款金额,则取款成功;如

JavaSE:多线程补充--线程通信

线程通信我认为是多线程中最难掌握的部分了,这里通过两个例子来说明一下. 第一个: 使用两个线程打印 1-100. 线程1, 线程2 交替打印 public class Print implements Runnable{ int i = 1; public void run(){ while(true){ synchronized(this){ if(i<100){ notify(); System.out.println(Thread.currentThread().getName() + &qu

Android线程通信

摘要 andriod提供了 Handler 和 Looper 来满足线程间的通信.例如一个子线程从网络上下载了一副图片,当它下载完成后会发送消息给主线程,这个消息是通过绑定在主线程的Handler来传递的. 正文 图解: 代码示例: /** * @author allin.dev * http://allin.cnblogs.com */ public class MainThread extends Activity { private static final String TAG = "M

JavaSE——线程通信

线程通信: 如果线程A和线程B持有同一个MyObject类的对象object,这两个线程会去调用不同的方法,但是它们是同步执行的,比如:线程B需要等待线程A执行完了methodA()方法之后,它才能执行methodB()方法.这样,线程A和线程B就实现了 通信. 线程通信中要用到的方法:wait()方法: 执行同步锁(obj对象)的该方法的线程进入堵塞状态,会释放对象的锁,java虚拟机把该线程放到该对象的等待池中,该线程如果要再次执行,则需要其他线程将它唤醒. 1 package tongxi