并行和并发有什么区别?
并行:多个处理器或多核处理器同时处理多个任务。(多个CPU)
并发:多个任务在同一个 CPU 核上,按细分的时间片轮流(交替)执行,从逻辑上来看那些任务是同时执行。
线程和进程的区别?
- 一个程序下至少有一个进程,一个进程下至少有一个线程,一个进程下也可以有多个线程来增加程序的执行速度。
- 进程切换比较慢,开销比较大;线程切换比较快,开销比较小。
补充:
什么是进程和线程?
进程(process):进程是操作系统中运行的一个任务(一个应用程序运行在一个进程中)。进程是一块包含了某些资源的内存区域,操作系统利用进程把它的工作划分为一些功能单元。进程中拥有一个私有的虚拟地址空间,该空间仅能被它所包含的线程访问。
线程(thread):进程中所包含的一个或多个执行单元称为线程。线程只能归属于一个进程,且它只能访问所属线程所拥有的资源。每个线程都有自己的栈内存,线程共享进程内存。当操作系统创建一个进程后,该进程会自动申请一个名为主线程或首要线程的线程。
守护线程是什么?
守护线程是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。在 Java 中垃圾回收线程就是特殊的守护线程。
创建线程有哪几种方式?
- 继承 Thread 类并重写 run 方法创建线程,实现简单但不可以继承其他类
- 实现 Runnable 接口并重写 run 方法。避免了单继承局限性,编程更加灵活,实现解耦。
- 实现 Callable 接口并重写 call 方法,创建线程。可以获取线程执行结果的返回值,并且可以抛出异常。
- 使用线程池创建(使用 java.util.concurrent.Executor 接口)
说一下 runnable 和 callable 有什么区别?
- Runnable 接口 run 方法无返回值;Callable 接口 call 方法有返回值,支持泛型
- Runnable 接口 run 方法只能抛出运行时异常,且无法捕获处理;Callable 接口 call 方法允许抛出异常,可以获取异常信息
线程有哪些状态?
- 第一是 new->新建状态。在生成线程对象,并没有调用该对象的 start 方法,这是线程处于
创建状态。 - 第二是 Runnable->就绪状态。当调用了线程对象的 start 方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。
- 第三是 Running->运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线
程就进入了运行状态,开始运行 run 函数当中的代码。 - 第四是阻塞状态。阻塞状态是线程因为某种原因放弃 CPU 使用权,暂时停止运行。直到线
程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
(1)等待 – 通过调用线程的 wait() 方法,让线程等待某工作的完成。
(2)超时等待 – 通过调用线程的 sleep() 或 join()或发出了 I/O 请求时,线程会进入到阻塞状态。 当 sleep()状态超时、join()等待线程终止或者超时、或者 I/O 处理完毕时,线程重新转入就绪 状态。
(3)同步阻塞 – 线程在获取 synchronized 同步锁失败(因为锁被其它线程所占用),它会进入同
步阻塞状态。 - 第五是 dead->死亡状态: 线程执行完了或者因异常退出了 run()方法,该线程结束生命周期.