1.并行和并发有什么区别?
并发:在同一个处理器上,两个或多个事件在同一时间间隔发生。
并行:在不同处理器上,两个或者多个事件在同一时刻发生。
在一台处理器上“同时”处理多个任务,在多台处理器上同时处理多个任务。如hadoop分布式集群。
所以并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。
网上有个例子挺形象的:
你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。
你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。
你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。
2.同步和异步的区别?
同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。
异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。
3.程序、线程和进程的区别?
程序:是含有指令和数据的文件,存在储存设备中,即程序是静态的代码
进程:是一段正在执行的程序。
线程:一个进程中执行中的每个任务为一个线程。线程是进程的一个实体,是cpu调度和分派的基本单位
进程包含线程,进程中可包含多个线程,一个线程只属于一个进程。
4.守护线程是什么?
守护线程(即daemon thread),是个服务线程,准确地来说就是服务其他的线程。必须在启动之前设置setDaemon(true),前台线程执行完成后,守护线程才会终止。
5.创建线程有哪几种方式?
①. 继承Thread类创建线程类
定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。
创建Thread子类的实例,即创建了线程对象。
调用线程对象的start()方法来启动该线程。
②. 通过Runnable接口创建线程类
定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。
创建 Runnable实现类的实例,并依此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。
调用线程对象的start()方法来启动该线程。
③. 通过Callable和Future创建线程
创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值。
创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。
使用FutureTask对象作为Thread对象的target创建并启动新线程。
调用FutureTask对象的get()方法来获得子线程执行结束后的返回值。
6.说一下 runnable 和 callable 有什么区别?
Runnable接口中的run()方法的返回值是