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
- 作用与对象、函数、类。
热门评论
handler部分说的有问题