什么是进程(Process)和线程(Thread)?

进程是资源分配的最小单位,线程是CPU调度的最小单位。这个回答大家都知道,但是过于抽象。如果面试中问到,面试官并不是想让你重复这句话,他想要的是结合自己的理解进行解释说明。

进程(Process),从英文角度来讲Process不仅是进程,也是过程,拿到计算机里面来解释就是一段程序的执行过程。例如,当我们打开计算机,运行QQ的时候,是把QQ.exe这个程序从外存拿到了内存去运行,此时就会产生一个进程。当启动一个进程的时候,至少会启动一个主线程(Main Thread)。如果当前运行的程序需要多个任务(Task)协调运行,那么就会产生多个线程(Thread)。一个系统中,有很多进程,它们都会使用内存。为了确保内存不被别人使用,每个进程所能访问的内存都是划定好的,每个程序运行过程互不影响。

什么是并发和并行?

并发:同一时间段内,多个程序在运行。

并行:同一时刻,计算机的多个CPU执行多个进程,互不影响。

看起来它们虽然都说是"多个进程同时运行",但是它们的"同时"不是一个概念。并行的"同时"是同一时刻可以多个进程在运行(处于running),并发的"同时"是经过上下文快速切换(Context Switch),使得看上去多个进程同时都在运行的现象,是一种同时运行的假象。实际上,当程序中写下多进程或多线程代码时,这意味着的是并发而不是并行。

上下文切换简单来说就是CPU对进程或线程进行切换。因为CPU是按照时间片给每个线程分配执行的时间,当A线程的时间片用完,要切换到B线程,此时就需要保存A线程当前的状态,等到下一次A线程得到CPU的时间片再恢复到运行时的状态。所以并不是线程越多越快,多线程编程时要考虑到上下文切换的开销。

JAVA实现多线程的方式:

1.继承Thread类

2.实现Runnable接口

3.实现Callable接口

优缺点也是显而易见的,JAVA是单继承多实现的语言,所以如果需要继承其他类就考虑实现接口的方式。两个接口也是有区别的,Runnable接口没有返回值,只需要执行完毕就可以,Callable可以有返回值可以抛异常(通过FutureTask获取)。在实际使用过程中,通常结合线程池一起使用。

线程的5种状态:

新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)、死亡(Dead)。

Process error是什么意思_对象锁

 

线程何时终止运行:

1.任务执行完毕

2.任务抛异常

3.使用 stop() 强制停止运行。这个方法不释放资源,可能会导致死锁的问题,是个过时的方法不建议使用。

Java中interrupt、interrupted和isInterrupted的关系与区别:

interrupt():给线程一个中断信号,需要用户根据业务具体处理

isInterrupted():查看线程是否中断,中断标志位为true则中断

interrupted():静态方法,查看线程是否中断,会清除中断标志

JAVA中volatile和synchronized:

volatile:保证共享资源的可见性,不保证原子性

synchronized:对象锁,由JVM实现,如果修饰静态类为类锁(锁class)

JAVA中wait()、notify()、notifyAll():

三者都为Object的方法,一般结合synchronized关键字使用

wait():阻塞等待

notify():通知唤醒一个线程

notifyAll():通知唤醒所有线程

通知等待范式:

等待方:1.获取对象锁 2.循环判断条件是否满足,满足则执行业务,不满足则wait()

通知方:1.获取对象锁 2.改变条件 3.notifyAll()通知等待线程 (使用notify可能会出现信号丢失)