1:在单核的CPU上,多线程的设计为什么也能够提高程序的整体性能?
原因就是:阻塞!
如IO阻塞,这种情况超出了当前运行程序所用控制的范围,所以,如果是单线程,则整个程序都将停下来,而多线程情况下,其它线程还能够继续执行。
事实上,如果没有任务会阻塞,那么在单处理器上使用并发就没有任何意义!
2:extends Thread 与 implements Runnable的区别?
要看所表达的语义是什么?是要表示一个任务,还是表示一个线程对象?
引用网上的一段话:http://topic.youkuaiyun.com/u/20090316/13/37e19f74-470f-4e9e-b5b7-508fe92ac3eb.html
答:楼主的着眼点仅仅是语法等上的区别,学习时更应该注重概念背后隐藏的设计意图.若仅仅从语言或语法本身着眼,容易设计出"怪胎式"的代码.
1)一般认为:实现Runnable接口的对象,其着眼点主要含义是:一个计算任务.它代表一个要被其它线程(如:线程池中的线程)执行的任务.着眼点是:交由其它人去完成的一个计算任务. ---对应着:要做的工作
2)一般认为:从Thread类继承的含义主要是:一个能执行其它(或自己)的任务的一个线程对象.着眼点是:线程的功能(通过继承来扩展执行其它计算任务的能力) ---对应着:做工作的工作人员
3)当然:若一个类已有父亲,不能再从Thread类继承,只好实现Runnable接口来达到线程的目的,这是一种选择了.
以上仅是从设计代码的一种意图上说明,仅供你参考.
3:事件驱动中对于异步调用的结果获取的两种策略:
拉:调用者(Caller)自己去取结果,并在取得结果后进行下一步的处理:Future模式
推:被调者(Callee)通过持有后处理操作(ProcessData)的接口类型的引用(该引用可以是任何满足接口定义的类型,包括Caller本身),来完成下一步的处理,即使用: 回调机制
两种方式的实现方法都是通过在抛出的事件(Event)中带有不同的参数,具体来说,
对于 拉:event = {eventhandler, parameters(供EventHandler使用), FutureResult(在Caller中已经持有的一个引用,指向最终Callee将存放结果的位置)}
对于 推:event = {eventhandler, parameters(供EventHandler使用), ProcessData(包含回调方法的接口引用)}