手记

略讲Android 中的多线程

Handler

  • Handler必须在主线程中创建。
  • 默认情况下,消息队列只有一个,即主线程的消息队列。
  • 每个Hanlder都关联了一个线程,每个线程内部都维护了一个消息队列MessageQueue,这样Handler实际上也就关联了一个消息队列。
  • 消息队列通过Looper与线程关联,而handler又与Looper关联,因此handler最终就和线程、线程的消息队列关联上了。

Thread和Runnable

  • wait() 当一个线程执行到wait() 方法时,它就进入到一个和该对象相关的等待池中,同时失去(释放)了对象的机锁,使得其他线程可以访问。用户可以使用notify、notifyAll或者指定睡眠时间来唤醒当前等待池中打线程。
  • sleep() 该函数时Thread打静态函数,作用是调用线程进入睡眠状态,因此它不能改变对象打机锁。所以,当在一个Synchronized快中调用sleep方法时,线程虽然休眠了,但是对象打机锁并没有被释放,其他线程无法访问这个对象。
  • join() 等待目标线程执行完之后再继续执行。、
  • yield() 线程礼让,目标线程由运行状态转换为就绪状态,也就是让出执行权限,让其他线程得以优先执行,但其他线程是否优先执行是未知的。

线程池

java四种线程池的优点

  • 重用存在的线程,减少对象创建、销毁的开销。
  • 可有效控制最大并发线程,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。
  • 提高定时执行、定期执行、单线程、并发控制等功能。

线程池原理简单解释就是创建多个线程并且进行管理,提交给线程打任务会被线程池指派给其中的线程进行执行,通过线程的统一调度、管理使得多线程的使用更简单、高效。

线程池的使用准则

  • 不要对那些同步等待其他任务结果的任务排队,这可能导致死锁。
  • 理解任务。有效地管理线程池的大小、理解正在排队的任务以及它们正在做什么。
  • 如果再一个具有N个处理器的系统上只有一个工作队列,其中全部是计算性质的任务,在线程池具有N或者N+1个线程一般会获得最大的CPU利用率。
  • 对于那些可能需要等待I/O完成的任务,需要让线程池的大小超过可用处理器的数目,因为并不是所有的线程都一直在工作。

同步集合

程序中的优化策略---CopyOnWriteArrayList

提高并发效率---ConcurrentHashMap

有效的方法---BlockingQueue(阻塞队列)

  • 当队列满时,再次调用put函数添加元素到队列,那么调用线程将会阻塞。

同步锁

同步机制的关键---Synchronized

  • 作用与对象、函数、类。
7人推荐
随时随地看视频
慕课网APP

热门评论

handler部分说的有问题

查看全部评论