软技能集 面试题集

面试中与线程相关的面试题

2019-10-27  本文已影响0人  怡红快绿

1、start()方法与run()方法有什么区别

start()方法的作用是通知虚拟机现在可以开启新线程来执行任务,然后虚拟机会在恰当的时机调用线程的run()方法执行任务。这个恰当的时机指的是线程获取到CPU的执行时间。
如果直接调用thread.run()方法,那么任务将会直接在当前线程中执行,不会开启一个新的线程。

简单理解就是:调用start()方法会开启新线程异步执行任务,直接调用run()方法就相当于执行一个普通的方法。

2、如何停止线程

可以参考另一篇文章 学会优雅地停止线程,告别暴力停止线程

3、interrupted()与isInterrupted()两个方法的区别是什么

可以参考另一篇文章 学会优雅地停止线程,告别暴力停止线程

4、wait()与sleep()有什么区别

参考https://blog.csdn.net/qq_34490018/article/details/81609147

sleep()方法

Thread类的静态方法,它的作用是使当前正在执行的线程进入睡眠状态(暂时停止执行),并且睡眠状态持续指定的时间,具体取决于系统计时器和调度程序的精度和准确性。

当线程处于上锁时,sleep()方法不会释放对象锁,即睡眠时也持有对象锁。只会让出CPU执行时间片,并不会释放同步资源锁。

休眠时间满后,该线程不一定会立即执行,这是因为其他线程可能正在运行而且没有被调度为放弃执行,除非此线程具有更高的优先级。

必须捕获异常,在sleep的过程中过程中有可能被其他对象调用它的interrupt(),产生InterruptedException异常,如果你的程序不捕获这个异常,线程就会异常终止,进入TERMINATED状态,如果你的程序捕获了这个异常,那么程序就会继续执行catch语句块(可能还有finally语句块)以及以后的代码。

wait()方法

Object类的成员方法,它的作用是使线程进入等待状态,直到另一个线程使用notify()方法、notiftAll()方法或者等待指定时间来唤醒当前等待池中的线程。等待的线程只是被激活,但是必须得再次获得锁才能继续往下执行,也就是说只要锁没被释放,原等待线程因为为获取锁仍然无法继续执行。notify的作用只负责唤醒线程,线程被唤醒后有权利重新参与线程的调度。

wait()方法、notify()方法和notiftAll()方法用于协调多线程对共享数据的存取,所以只能在同步方法或者同步块中使用,否则抛出IllegalMonitorStateException。

  1. 属于不同的两个类,sleep()方法是线程类(Thread)的静态方法,wait()方法是Object类里的方法。
  2. sleep()方法不会释放锁,wait()方法释放对象锁。
  3. sleep()方法可以在任何地方使用,wait()方法则只能在同步方法或同步块中使用。
  4. sleep()必须捕获异常,wait()方法、notify()方法和notiftAll()方法不需要捕获异常。
  5. sleep()使线程进入阻塞状态(线程睡眠),wait()方法使线程进入等待队列(线程挂起),也就是阻塞类别不同。

未完待续~~~

上一篇下一篇

猜你喜欢

热点阅读