怎么让3个线程顺序执行
redis多路复用如何保证顺序?
redis多路复用如何保证顺序?
redis是一个单进程单线程的内存数据库,主要用来作为缓存系统。采用了网络io多路复用技术来保证在多连接的时候的系统的吞吐量
因为redis是单线程的,所有的操作都是按照顺序线性执行的,但是由于读写操作是阻塞的,所以某个请求假如是阻塞的话那么整个进程都无法对其他客户端提供服务。所以就有了io多路复用
redis的io多路复用模型是基于epoll实现的,多路复用技术还有select,poll。选择epoll实现的原因就是epoll有以下优点:
1.epoll没有最大并发连接的限制,上限是最大可以打开文件的数目
2.效率更高,epoll只管活跃的连接,而与连接总数无关
3.内存使用上epoll使用了共享内存,所以内存拷贝也省略了
其实io多路复用就是通过一种机制,可以监视多个描述符,一旦某个描述符就绪,就能够通知程序进行相应的操作(通过监视描述符,将对数据库的操作转换成了事件,从而减少了线程切换时上下文的切换和竞争)
线程池四种队列实现原理?
Java提供的四种线程池实现
(1)newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
(2)newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
(3)newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
(4)newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
如何控制多线程执行顺序?
线程在启动以后,并不是立马执行,而是要等待CPU的一个资源调度,而CPU调度的顺序是操作系统通过复杂算法计算得到的。等启动的线程得到CPU指令后,才和主线程做一个切换,执行run方法,所以说自然情况下并不是按启动顺序执行,如下图:
要想线程按照顺序执行,可以有如下方法。
方法一:join方法的使用
join方法的作用就是让正在执行的线程停止,释放出cpu控制权,让调用join的线程立即执行,如下图:
方法二:ExecutorService
通过ExecutorService executors ()创建这个单线程的线程池,然后将所有要执行的线程任务提交到线程池,如下图: