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

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()方法使线程进入等待队列(线程挂起),也就是阻塞类别不同。

未完待续~~~

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 下面是Java线程相关的热门面试题,你可以用它来好好准备面试。 1) 什么是线程? 线程是操作系统能够进行运算调度...
    冰箱哥哥阅读 561评论 0 2
  • 本文出自 Eddy Wiki ,转载请注明出处:http://eddy.wiki/interview-java.h...
    eddy_wiki阅读 2,305评论 0 14
  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 3,117评论 1 18
  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 2,602评论 1 15
  • 一、进程和线程 进程 进程就是一个执行中的程序实例,每个进程都有自己独立的一块内存空间,一个进程中可以有多个线程。...
    阿敏其人阅读 2,714评论 0 13

友情链接更多精彩内容