java面试题之------多线程
来源:互联网 发布:linux下的sleep函数 编辑:程序博客网 时间:2024/05/21 22:27
1.Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别?
sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程暂停执行指定的时间,将执行机会(CPU)让给其他线程,
但是对象的锁依然保持,因此休眠时间结束后会自动恢复(线程回到就绪状态)。
wait()是Object类的方法,调用对象的wait()方法导致当前线程放弃对象的锁(线程暂停执行),进入对象的等待池(wait pool),只有调用
对象的notify()方法(或notifyAll()方法)时才能唤醒等待池中的线程进入等锁池(lock pool),如果线程重新获得对象的锁就可以进入就绪状态。
2.线程的sleep()方法和yield()方法有什么区别?
答:
sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会;yield()方法只会给相同优先级或更高优先级的
线程以运行的机会;
线程执行sleep()方法后转入阻塞(blocked)状态,而执行yield()方法后转入就绪(ready)状态;
sleep()方法声明抛出InterruptedException,而yield()方法没有声明任何异常;
sleep()方法比yield()方法(跟操作系统CPU调度相关)具有更好的可移植性。
3.当一个线程进入一个对象的synchronized方法A之后,其它线程是否可进入此对象的synchronized方法B?
答:
不能。其它线程只能访问该对象的非同步方法,同步方法则不能进入。因为非静态方法上的synchronized修饰符要求执行方法时要获得对象的锁,
如果已经进入A方法说明对象锁已经被取走,那么试图进入B方法的线程就只能在等锁池(注意不是等待池哦)中等待对象的锁。
4.请说出与线程同步以及线程调度相关的方法。
答:
wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁;
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要处理InterruptedException异常;
notify():唤醒一个处于等待状态的线程,当然在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,
而且与优先级无关;
notityAll():唤醒所有处于等待状态的线程,该方法并不是将对象的锁给所有线程,而是让它们竞争,只有获得锁的线程才能进入就绪状态;
5.编写多线程程序有几种实现方式?
Java 5以前实现多线程有两种实现方法:一种是继承Thread类;另一种是实现Runnable接口。两种方式都要通过重写run()方法来定义线程的行
为,推荐使用后者,因为Java中的继承是单继承,一个类有一个父类,如果继承了Thread类就无法再继承其他类了,显然使用Runnable接口更为灵
活。Java5以后出现了第3种方式,实现Callable接口,该接口中的call方法可以在线程执行结束时产生一个返回值。
- java面试题之------多线程
- java面试题解惑 之 多线程
- java多线程面试题
- java多线程面试题
- java多线程面试题
- java多线程面试题
- java多线程面试题
- java多线程面试题
- Java多线程面试题
- java多线程面试题
- java 多线程面试题
- java多线程面试题
- java多线程面试题
- java多线程面试题
- java多线程面试题
- java多线程面试题
- java多线程面试题
- java多线程面试题
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
- 分金子[2017年360春招笔试编程题]
- dependency和dependencyManagement
- PAT 1014. Waiting in Line (30)
- 数据结构——链式栈
- java面试题之------多线程
- CST时间格式化出现误差问题
- JS 中关于this 执行环境的问题_part3
- Scala伴生类和伴生对象
- VGGNet 内存占用分析
- iPhone苹果手机如何设置使用非系统自带铃声
- PHP RabbitMQ 实践第三部
- canOpenURL: failed for URL: "xx"
- 解决DatePicker在高版本上显示成material design风格的问题