今天整理出了一些 面试题,给大家分享下
1.进程和线程之间有什么不同?
一个进程是一个独立的运行环境,他可以被看做一个程序或者一个应用.
而线程是在进程中执行的一个单元.java运行环境是一个包含 了不同类和程序的单一
进程.线程可以被称为轻量级的进程.线程需要较少的资源来创建和驻留在进程 中 ,
并且可以共享进程中的资源.
2.多线程编程的好处是什么?
在多线程程序中,多个线程被并发的执行以提高程序的效率 ,cpu不会因为某个线程
需要等待资源而进入空闲状态.多个线程共享堆内存,因此创建多个线程去执行一些任务
会比创建多个进程更好.举个例子,servlets比cgi更好,是因为servlets支持多线程而cgi不支持.
3.用户线程和守护线程有什么区别?
当我们在java程序中 创建一个线程,它就被称为用户线程 .一个守护线程是在后台执行
并且不会阻止jvm终止的线程.当没有用户线程在运行的时候,jvm关闭程序并且推出.
一个守护线程创建的子线程 依然是守护线程.
4.你对线程优先级的理解是什么?
每一个线程都是有优先级的,一般来说,高优先级的线程在运行时会具有优先权,但这
依赖于线程调度的实现,这个实现是和操作系统相关的.我们可以定义线程的优先级,
但是并 不能抱住高优先级的线程会在低优先级的线程几千执行.线程优先级是一个int
变量(从1-10),1代表最低优先级,10代表最高优先级.
5. 什么是线程调度器和时间分片?
线程调度器是一个操作系统服务,他负责为Runnble状态的线程分配cpu时间.
一旦我们创建一个线程并启动它,他的执行便依赖于线程调度器的实现.时间分片是指将可用的cpu时间分配给可用的runnable线程的过程.分配cpu时间可以给予线程优先级或者线程等待时间.线程调度并不受java虚拟机控制,所以由应用程序来控制它是更好的选择.
6. 在多线程中,什么是上下文切换(context-switching)?
上下文切换是存储和恢复CPU状态的过程,它使得线程执行能够从中断点恢复执行。上下文切换是多任务操作系统和多线程环境的基本特征。
7.线程之间是如何通信的?
当线程间是可以共享资源时,线程间通信是协调它们的重要的手段。Object类中wait()
otify()
otifyAll()方法可以用于线程间通信关于资源的锁的状态。点击这里有更多关于线程wait, notify和notifyAll.
8.为什么线程通信的方法wait(), notify()和notifyAll()被定义在Object类里?
Java的每个对象中都有一个锁(monitor,也可以成为监视器) 并且wait(),notify()等方法用于等待对象的锁或者通知其他线程对象的监视器可用。在Java的线程中并没有可供任何对象使用的锁和同步器。这就是为什么这些方法是Object类的一部分,这样Java的每一个类都有用于线程间通信的基本方法
9. 什么是ThreadLocal?
ThreadLocal用于创建线程的本地变量,我们知道一个对象的所有线程会共享它的全局变量,所以这些变量不是线程安全的,我们可以使用同步技术。但是当我们不想使用同步的时候,我们可以选择ThreadLocal变量。
每个线程都会拥有他们自己的Thread变量,它们可以使用get()set()方法去获取他们的默认值或者在线程内部改变他们的值。ThreadLocal实例通常是希望它们同线程状态关联起来是private static属性。在ThreadLocal例子这篇文章中你可以看到一个关于ThreadLocal的小程序。
10. 什么是Thread Group?为什么建议使用它?
ThreadGroup是一个类,它的目的是提供关于线程组的信息。
ThreadGroup API比较薄弱,它并没有比Thread提供了更多的功能。它有两个主要的功能:一是获取线程组中处于活跃状态线程的列表;二是设置为线程设置未捕获异常处理器(ncaught exception handler)。但在Java 1.5中Thread类也添加了setUncaughtExceptionHandler(UncaughtExceptionHandler eh) 方法,所以ThreadGroup是已经过时的,不建议继续使用。