以下是我测试的结果,可以看出,当不超过1百万的时候,并行是明显比串行要慢的,为什么并发执行的速度会比串行慢呢?这是因为线程有创建和上下文切换的开销。
3)什么是同步?什么又是异步?解析:这是对多线程基础知识的考察
答:同步和异步通常用来形容一次方法调用。
同步方法调用一旦开始,调用者必须等到方法返回后,才能继续后续的行为。这就好像是我们去商城买一台空调,你看中了一台空调,于是就跟售货员下了单,然后售货员就去仓库帮你调配物品,这天你热的实在不行,就催着商家赶紧发货,于是你就在商店里等着,知道商家把你和空调都送回家,一次愉快的购物才结束,这就是同步调用。
而异步方法更像是一个消息传递,一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作。回到刚才买空调的例子,我们可以坐在里打开电脑,在网上订购一台空调。当你完成网上支付的时候,对你来说购物过程已经结束了。虽然空调还没有送到家,但是你的任务都已经完成了。商家接到你的订单后,就会加紧安排送货,当然这一切已经跟你无关了,你已经支付完成,想什么就能去干什么了,出去溜达几圈都不成问题。等送货上门的时候,接到商家电话,回家一趟签收即可。这就是异步调用。
面试官:那并发(Concurrency)和并行(Parallelism)的区别呢?
解析:并行性和并发性是既相似又有区别的两个概念。
答:并行性是指两个或多个事件在同一时刻发生。而并发性是指连个或多个事件在同一时间间隔内发生。
在多道程序环境下,并发性是指在一段时间内宏观上有多个程序在同时运行,但在单处理机环境下(一个处理器),每一时刻却仅能有一道程序执行,故微观上这些程序只能是分时地交替执行。例如,在1秒钟时间内,0-15ms程序A运行;15-30ms程序B运行;30-45ms程序C运行;45-60ms程序D运行,因此可以说,在1秒钟时间间隔内,宏观上有四道程序在同时运行,但微观上,程序A、B、C、D是分时地交替执行的。
如果在计算机系统中有多个处理机,这些可以并发执行的程序就可以被分配到多个处理机上,实现并发执行,即利用每个处理机处理一个可并发执行的程序。这样,多个程序便可以同时执行。以此就能提高系统中的资源利用率,增加系统的吞吐量。
4)线程和进程的区别:(必考)答:
进程是一个 “执行中的程序”,是系统进行资源分配和调度的一个独立单位;
线程是进程的一个实体,一个进程中拥有多个线程,线程之间共享地址空间和其它资源(所以通信和同步等操作线程比进程更加容易);
线程上下文的切换比进程上下文切换要快很多。
(1)进程切换时,涉及到当前进程的 CPU 环境的保存和新被调度运行进程的 CPU 环境的设置。
(2)线程切换仅需要保存和设置少量的寄存器内容,不涉及存储管理方面的操作。
面试官:进程间如何通讯?线程间如何通讯?
答:进程间通讯依靠 IPC 资源,例如管道(pipes)、套接字(sockets)等;
线程间通讯依靠 JVM 提供的 API,例如 wait()、notify()、notifyAll() 等方法,线程间还可以通过共享的主内存来进行值的传递。
关于线程和进程有一篇写得非常不错的文章,不过是英文的,我进行了翻译,相信阅读之后会对进程和线程有不一样的理解:线程和进程基础——翻译文
5)什么是阻塞(Blocking)和非阻塞(Non-Blocking)?