十、Java并发系列之 Java 并发编程面试题
应聘Java 岗,总是免不了几个 Java 并发编程的面试题,不过大多数都局限在 java.util.concurrent 包下的知识和实现问题。本文针对 Java 并发相关的常见的面试题做一些解释。
Q1: 进程和线程的区别?
> 这是一个非常基础的面试题,如果这道题没有回答的比较满意,一般情况下,面试官会认为应聘者在并发方面的基础只是不牢固,就不会继续深入询问其它并发问题了。
1、 进程和线程都是并发单元,但它们有一个根本区别:进程不共享公共内存,而线程则共享;
2、 从操作系统的角度来看,进程是一个独立的软件,在其自己的虚拟内存空间中运行任何一个多任务操作系统(这几乎意味着任何现代操作系统)都必须将内存中的进程分开,这样一个失败的进程就不会通过加扰公共内存来拖累所有其它进程因此,进程通常是隔离的,它们通过进程间通信进行协作,进程间通信由操作系统定义为一种中间API;
3、 相反,线程是应用程序的一部分,它与同一应用程序的其他线程共享公共内存使用公共内存可以减少大量开销,因此使用线程可以更快的交换数据和进行线程间协作;
> 关于进程间通讯那一块可以不用回 答,如果你不懂的话,不必然会导致接下来的某个问题是 进程间通讯的的原理.
Q2: 如何创建一个线程实例并且运行它?
> 这道题考察的是对 Runnable 的理解。
创建一个线程的实例,有两种方法可供选择:
1、 把Runnable的实例传递给Thread的构造函数并调用start()方法;
Thread thread1 = new Thread(() ->
System.out.println("Hello World from Runnable!"));
thread1.start();
Runnable是一个函数接口,因此可以作为 lambda 表达式传递
2、 因为线程本身也实现了Runnable接口,所以另一种创建线程的方法是创建一个匿名子类,覆写它的run()方法,然后调用start();
Thread thread2 = new Thread() {
@Override
public void run() {
System.out.println("Hello World from subclass!");
}
};
thread2.start();