Java高级开发工程师面试——多线程

时间:2023-01-05 16:16:22

来自:Sanesee

链接:http://www.sanesee.com/article/java-engineer-interview-of-thread

1.进程和线程的区别?

进程是一个具有独立功能的程序关于某个数据集合的执行活动,不同的进程拥有独立的内存空间;线程是程序执行的最小单位,一个或多个线程组成一个进程,同一个进程中的所有线程共享相同的内存空间,运行时都有一个线程栈来保存变量值信息。

2.Thread类中的start()和run()有什么区别?

start()是用来启动新创建的线程,在start()内部调用了run(),当前线程仅能通过start()启动一次线程;若在本线程中直接调用run(),则它为一个普通的方法调用而已,没有创建新的线程,可以调用多次。

3.Runnable和Callable有什么区别?

Runnable和Callable的核心功能没什么区别,只是Callable可以返回值和抛出异常。

4.volatile有什么作用?

使用volatile修饰的变量,线程每次在使用变量的时候,都会读取变量修改后的最新值。具体工作方式:从堆内存加载变量值到线程本地内存,建立一个变量副本,线程对变量的修改在线程内存完成,然后再将值写回堆内存。若两个线程对堆中的同一个变量进行操作,也会出现并发问题。

5.什么是竞态条件?

当多个线程同时执行一段代码(或使用相同资源),因为顺序原因导致执行结果不符合预期,就出现了竞态条件。

6.如何处理线程运行时发生的异常?

我们知道,Thread的run()是不抛出任何检查型异常(Checked Exception)的,而它自身有可能因异常而终止执行,即使用try…catch也没法捕获。Java5.0提供了一个Thread.setUncaughtExceptionHandler来设置对线程中未捕获异常的处理。

7.请简述ThreadLocal的作用。

当使用ThreadLocal修饰变量时,ThreadLocal为每个使用该变量的线程提供了独立的变量副本,每个线程可以独立地操作自己的副本,而不会影响到其它线程的副本。

8.为什么wait()和notify()需要在同步块中调用?

首先,JDK强制要求这样做,否则会抛出IllegalMonitorStateException;还有就是,这样可以避免wait和notify之间产生竞态条件。

9.请简述join()和yield()的作用。

t.join()表示阻塞主线程,等待t线程直到t线程运行结束;t.yield()表示阻塞t线程,将CPU资源让给其它相同优先级的资源。

10. 请简述wait()和sleep()方法有什么不同?

sleep()是由Thread提供的,它会释放CPU资源一段时间,但不会释放锁,等待的时间到了会恢复运行;wait()是由Object提供的,它会放弃对象锁,进入等待锁定池,直到针对此对象的notify()才能获取锁进入运行状态。