>
散列技术常常用于键-值关系的数据结构中,比如数据库索引、map、缓存等地方,其是通过在记录(值)的存储位置和其关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。散列技术的实现方式决定了其最适合的求解问题是查找与给值相等的记录(是否存在及其位置),而对于其他查找不适合:比如某个关键字对应很多记录的情况、范围查找、查找最值等。
在 memcached中有 Jenkins和Murmur两种散列函数可选, Nginx使用的是Murmur散列函数,而最近几年原Jenkins的作者推出了SpookyHash,而Google也发布了Murmur的改进型CityHash。如果有空余时间的人可以把这些新型的hash func封装好给memcached和Nginx提PR.
Google的所有产品都是基于64bit架构的.
想了解Hash的实现、使用和维护,就去读memcached的源码。
SQL性能瓶颈——CPU还是I/O限制?
> Android多线程的本质就是异步处理,直观一点说就是不要让用户感觉到“很卡”。
多线程实现方式implements Runnable 或 extends Thread
多线程核心机制是Handler.
1)Activity.runOnUiThread(Runnable)
2)View.post(Runnable) ;View.postDelay(Runnable , long)
3)Handler
4)AsyncTask
平时使用 Handler主要是用来处理多线程的异步交互问题!Activity所在的UI线程在创建的时候,就关联了Looper和MessageQueue,那么我们又在UI线程里创建了自己的Handler,那么Handler是属于UI线程的,从而它是可以和UI线程交互的!UI线程或Worker线程提供MessageQueue,Handler向其中填Message,Looper从其中读Message,然后交由 Message自己的target即Handler来处理!!最终被从属于UI线程的Handler的handlMessag(Message msg)方法被调用!!
这就是Android多线程异步处理最为核心的地方!!Handler并未创建线程,只与UI线程的Loop绑定了。
AsyncTask利用Handler来实现的!
-- Runnable是一个接口, Message.callback = Runnable
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
setImage(ivA,R.mipmap.a);
}
},5000);
第一是创建状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。
第二是就绪状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。
第三是运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。
第四是阻塞状态。线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。sleep,suspend,wait等方法都可以导致线程阻塞。
第五是死亡状态。如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪。
在 memcached中有 Jenkins和Murmur两种散列函数可选, Nginx使用的是Murmur散列函数,而最近几年原Jenkins的作者推出了SpookyHash,而Google也发布了Murmur的改进型CityHash。如果有空余时间的人可以把这些新型的hash func封装好给memcached和Nginx提PR.
Google的所有产品都是基于64bit架构的.
想了解Hash的实现、使用和维护,就去读memcached的源码。
SQL性能瓶颈——CPU还是I/O限制?
> Android多线程的本质就是异步处理,直观一点说就是不要让用户感觉到“很卡”。
多线程实现方式implements Runnable 或 extends Thread
多线程核心机制是Handler.
1)Activity.runOnUiThread(Runnable)
2)View.post(Runnable) ;View.postDelay(Runnable , long)
3)Handler
4)AsyncTask
平时使用 Handler主要是用来处理多线程的异步交互问题!Activity所在的UI线程在创建的时候,就关联了Looper和MessageQueue,那么我们又在UI线程里创建了自己的Handler,那么Handler是属于UI线程的,从而它是可以和UI线程交互的!UI线程或Worker线程提供MessageQueue,Handler向其中填Message,Looper从其中读Message,然后交由 Message自己的target即Handler来处理!!最终被从属于UI线程的Handler的handlMessag(Message msg)方法被调用!!
这就是Android多线程异步处理最为核心的地方!!Handler并未创建线程,只与UI线程的Loop绑定了。
AsyncTask利用Handler来实现的!
-- Runnable是一个接口, Message.callback = Runnable
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
setImage(ivA,R.mipmap.a);
}
},5000);
android-weak-handler- https://github.com/badoo/android-weak-handler
第一是创建状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。
第二是就绪状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。
第三是运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。
第四是阻塞状态。线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。sleep,suspend,wait等方法都可以导致线程阻塞。
第五是死亡状态。如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪。