sleep、wait、start、run、线程安全等面试题

sleep() 和 wait() 有什么区别?
  • sleep
    • 是 Thread 类的类方法
    • sleep 可以在任何地方使用
    • sleep 会休眠当前线程指定时间 有各 long 类型参数 毫秒为单位,释放 cpu 资源,不释放对象锁,休眠时间一到自动苏醒继续执行
  • wait
    • 是 Object 类的成员方法
    • wait 只能用在同步代码块中 否则抛出异常 Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
    • wait 方法会放弃持有的对象锁,进入等待队列,当该对象调用 notify或者notifyAll 方法后会竞争获取对象锁【等待队列处于等待运行状态】,进入运行
    • jdk1.8 sleep 和 wait 均需要捕获 InterruptedException异常
Thread 类中的 start 和 run 方法有什么区别
  • 系统通过调用线程类的 start 方法用来启动新线程,这个线程处于可运行状态。可以被 JVM 来调度执行,调度执行的其实就是 这个 run 方法,run 方法执行结束,该线程也会终止。
  • 直接调用 run 方法,则就是一个普通的 run 方法执行,和多线程没有关系了。
什么是线程安全? Vector 是一个线程安全类吗?
  • 线程安全:多线程访问时,采用加锁机制,当一个线程访问某个类的某个数据时,进行保护,其它线程不能访问这个数据直到这个线程执行结束,其它线程才可使用。不会出现数据不一致或数据污染
  • 虽然 Vactor 的所有方法都具有 synchronized 关键字修饰,但是对于复合操作, Vector还是需要进行同步处理的【单个方法的原子性不能保证符合操作也具有原子性】。它这么做并没有解决多线程问题,反而使得概念混乱,性能差【组织编译器乱序】
简述一下你对线程池的理解
  • 线程池的好处
    • 降低资源消耗。通过利用已创建的线程降低线程创建和销毁造成的消耗
    • 提高响应速度。任务到达时不许等待线程创建就可以直接执行。
    • 提高线程的可管理性。统一进行线程分配、调优和监控
Java 程序是如何执行的
  • 把 .java 文件编译成字节码文件即 .class 文件【编译器】
  • JVM 类加载器加载字节码文件【类加载器】
  • 加载完成进行字节码校验【校验器】
  • JVM解释器将字节码文件 翻译成对应系统的机器码去执行【此过程 有个 JIT 动态编译器 提高效率 】
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值