美文网首页
Java多线程面试问题

Java多线程面试问题

作者: 破荒之恋 | 来源:发表于2017-05-04 22:24 被阅读32次

1、进程与线程之间的不同

一个进程是一个独立的运行环境,可以被看作是一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一个包含了不同的类和程序的单一进程。线程可以被称为轻量级进程。线程需要较少的资源来创建和驻留在进程中,并且可以共享进程中的资源。

2、多线程编程的好处

在多线程程序中,多个线程并发执行可以提高程序的效率,CPU不会因为某个线程需要等待资源而进入空闲状态。多个线程共享堆内存,因此创建多个线程去执行一些任务会比创建多个进程更好。举个例子,Servlets比CGI更好,是因为Servlets支持多线程而后者不支持。

3、用户线程和守护线程有什么区别?

当我们在Java程序中创建一个线程,他就被称为用户线程。一个守护线程是在后台执行并且不会阻止JVM终止的线程。当没有用户线程在运行的时候,JVM关闭程序并且退出。一个守护线程创建的子线程依然是子线程。

4、我们如何创建一个线程

常见有两种创建方式:一、实现Runnable接口,然后将它传递给Thread的构造函数,创建一个Thread对象。二、直接继承Thread类。

5、有哪些不同的线程生命周期?

当我们在Java程序中新建一个线程时,它的状态是New。当我们调用线程的start()方法时,状态被改变为Runnable。线程调度器会为Runnable线程池中的线程分配CPU时间并且将他们的状态改变为Runnable。其他的线程状态还有Waiting,Blocked和Dead。

6、可以直接调用Thread类的run方法吗

当然可以,但是如果我们调用了Thread的run()方法,他的行为就会和普通的方法一样,为了在新的线程中执行我们的代码,必须使用Thread.start()方法。

7、如何让正在运行的线程暂停一段时间?

我们可以使用Thread类的Sleep()方法让线程暂停一段时间,需要注意的是,这并不会让线程终止,一旦从休眠中唤醒线程,线程的状态就会被改变为Runnable,并且根据线程调度,他将得到执行。

8、你兑线程优先级的理解

每一个线程都是优先级的,一般来说,高优先级的线程在运行时会具有优先权,但这依赖于线程调度的实现,这个实现是和操作系统相关。我们也可以定义线程的优先级,但是并不能保证高优先级的线程一定会在低优先级的线程前面执行。线程优先级是一个int变量,1-10,1代表最低优先级,10代表最高优先级。

9、在多线程中,什么是上下文切换?

上下文切换是存储和恢复CPU状态的过程,他使得线程执行能够从中断点恢复执行。上下文切换是多任务操作系统和多线程环境的基本特征。

10、线程之间是如何通讯的

当线程是可以共享资源时,线程间通讯是协调他们的重要手段。Object类的wait()\notify()\notifyAll()方法可以用于线程间通讯关于资源锁的状态。

11、为什么线程通讯的方法wait(),notify(),notifyAll()被定义在Object类里?

Java的每一个对象中都有一个锁,并且wait(),notify()等方法用于等待对象的锁或者通知其他线程对象的监视器可用。在Java程序中并没有可供任何对象使用的锁和同步器。这就是为什么这些方法是Object类的一部分,这样Java的每一个类都有用于线程间通讯的基本方法。

12、为什么wait(),notify(),notifyAll()必须再同步方法或者同步块中被调用?

当一个线程需要调用对象的wait()方法时,这个线程必须拥有该对象地锁,接着它会释放这个对象锁并进入等待状态直到其他线程调用对象上的notify()方法时。同样的,当一个线程需要调用notify()方法时,他会释放这个对象地锁,以便其他在等待的线程可以得到这个对象锁。由于这些方法都需要线程持有对象地锁,这样就只能通过同步来实现,所以他们只能在同步方法或者同步块中被调用。

13、为什么Thread类的sleep()和yield()方法是静态的?

Thread类的sleep()和yield()方法将在当前执行的线程上运行。所以在其他处于等待的线程上调用这些方法是没有意义的,这就是为什么这些方法是静态的。他们可以在当前正在执行的线程中工作,并避免程序员错误的认为可以在其他非运行上的线程上调用这些方法。

14、如何确保线程安全?

在Java中有很多方法来保证线程同步----安全,使用原子类,实现并发锁,使用volatile关键字,使用不变类和线程安全类。

15、volatile关键字在Java中有什么作用?

当我们使用volatile关键字去修饰变量的时候,所有线程都会直接读取这个变量并且不去缓存他。这就确保了线程读取的变量是同内存中是一致的。

16、同步方法和同步块,哪个是更好的选择?

同步块是更好的选择,因为他不会锁住整个对象(当然也可以锁住整个对象)。同步方法会锁住整个对象,哪怕这个类中有多个不相关联的同步块,这通常会导致他们停止执行并需要等待获得这个对象上的锁。

17、什么是死锁,如何分析避免他?

死锁就是指两个以上的线程永远阻塞的情况,这种情况产生至少需要两个以上的线程和两个以上的资源。分析避免死锁,每一个资源都有一个id,这个id我们可以找出那些线程已经拥有了它的对象锁。避免嵌套锁,只在需要的地方使用锁和避免无限期等待是避免死锁的通常方法。

18、什么是Timer类?如何创建一个有特定时间间隔的任务?

java.util.Timer类是一个工具类,可以用于安排一个线程在未来的某个特定时间执行。Timer类可以用安排一次性任务或者周期性任务。Java.util.TimerTask是一个实现了Runnable接口的抽象类,我们需要继承这个类来创建我们自己的定时任务并使用Timer去安排他的执行。

19、什么是线程池,如何创建一个Java线程池

一个线程池管理了一组线程,同事还包括了一个用于放置等待执行的任务的队列。java.util.concurrent.Executors提供了一个Executor接口的实现用于创建线程池。

来源于:http://blog.jobbole.com/76308/

相关文章

网友评论

      本文标题:Java多线程面试问题

      本文链接:https://www.haomeiwen.com/subject/unirtxtx.html