文章目录
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 动态编译器 提高效率 】