————————————————————————————————————————————————————— JAVA 多线程和并发基础面试问答多线程和并发问题是 Java 技术面试中面试官比较喜欢问的问题之一。在这里, 从面试的角度列出了大部分重要的问题, 但是你仍然应该牢固的掌握 Java 多线程基础知识来对应日后碰到的问题。( 校对注:非常赞同这个观点) Java 多线程面试问题 1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained) 的运行环境,它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。 Java 运行环境是一个包含了不同的类和程序的单一进程。线程可以被称为轻量级进程。线程需要较少的资源来创建和驻留在进程中, 并且可以共享进程中的资源。 2. 多线程编程的好处是什么? 在多线程程序中,多个线程被并发的执行以提高程序的效率, CPU 不会因为某个线程需要等待资源而进入空闲状态。多个线程共享堆内存(heap memory) ,因此创建多个线程去执行一些任务会比创建多个进程更好。举个例子, Servlets 比 CGI 更好, 是因为 Servlets 支持多线程而 CGI 不支持。 3. 用户线程和守护线程有什么区别? 当我们在 Java 程序中创建一个线程,它就被称为用户线程。一个守护线程是在后台执行并且不会阻止 JVM 终止的线程。当没有用—————————————————————————————————————————————————————户线程在运行的时候, JVM 关闭程序并且退出。一个守护线程创建的子线程依然是守护线程。 4. 我们如何创建一个线程? 有两种创建线程的方法:一是实现 Runnable 接口,然后将它传递给 Threa d 的构造函数, 创建一个 Threa d 对象; 二是直接继承 Threa d 类。若想了解更多可以阅读这篇关于如何在 Java 中创建线程的文章。 5. 有哪些不同的线程生命周期? 当我们在 Java 程序中新建一个线程时,它的状态是 New 。当我们调用线程的 start() 方法时, 状态被改变为 Runnable 。线程调度器会为 Runnable 线程池中的线程分配 CPU 时间并且讲它们的状态改变为 Running 。其他的线程状态还有 Waiting , Blocked 和 Dead 。读这篇文章可以了解更多关于线程生命周期的知识。 6. 可以直接调用 Thread 类的 run() 方法么? 当然可以,但是如果我们调用了 Thread 的 run() 方法,它的行为就会和普通的方法一样, 为了在新的线程中执行我们的代码, 必须使用 () 方法。 7. 如何让正在运行的线程暂停一段时间? 我们可以使用 Thread 类的 Sleep() 方法让线程暂停一段时间。需要注意的是, 这并不会让线程终止, 一旦从休眠中唤醒线程, 线程的状态将会被改变为 Runnable ,并且根据线程调度,它将得到执行。 8. 你对线程优先级的理解是什么? 每一个线程都是有优先级的, 一般来说, 高优先级的线程在运行—————————————————————————————————————————————————————时会具有优先权, 但这依赖于线程调度的实现, 这个实现是和操作系统相关的(OS dependent) 。我们可以定义线程的优先级,但是这并不能保证高优先级的线程会在低优先级的线程前执行。线程优先级是一个 int 变量(从 1- 10) ,1 代表最低优先级, 10 代表最高优先级。 9. 什么是线程调度器(Thread Scheduler) 和时间分片(Time Slicing) ? 线程调度器是一个操作系统服务,它负责为 Runnable 状态的线程分配 CPU 时间。一旦我们创建一个线程并启动它,它的执行便依赖于线程调度器的实现。时间分片是指将可用的 CPU 时间分配给可用的 Runnable 线程的过程。分配 CPU 时间可以基于线程优先级或者线程等待的时间。线程调度并不受到 Java 虚拟机控制,所以由应用程序来控制它是更好的选择( 也就是说不要让你的程序依赖于线程的优先级)。 10. 在多线程中,什么是上下文切换(context-switching) ? 上下文切换是存储和恢复 CPU 状态的过程,它使得线程执行能够从中断点恢复执行。上下文切换是多任务操作系统和多线程环境的基本特征。 11. 你如何确保 main() 方法所在的线程是 Jav a 程序最后结束的线程? 我们可以使用 Thread 类的 joint() 方法来确保所有程序创建的线程在 main() 方法退出前结束。这里有一
java多线程和并发基础面试问答 来自淘豆网m.daumloan.com转载请标明出处.