java

导航

2020java高频面试题及答案:第九部分

来源 :中华考试网 2020-10-10

  线程的sleep()方法和yield()方法有什么区别?

  答:

  ① sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会;yield()方法只会给相同优先级或更高优先级的线程以运行的机会;

  ② 线程执行sleep()方法后转入阻塞(blocked)状态,而执行yield()方法后转入就绪(ready)状态;

  ③ sleep()方法声明抛出InterruptedException,而yield()方法没有声明任何异常;

  ④ sleep()方法比yield()方法(跟操作系统CPU调度相关)具有更好的可移植性。

  当一个线程进入一个对象的synchronized方法A之后,其它线程是否可进入此对象的synchronized方法B?

  答:不能。其它线程只能访问该对象的非同步方法,同步方法则不能进入。因为非静态方法上的synchronized修饰符要求执行方法时要获得对象的锁,如果已经进入A方法说明对象锁已经被取走,那么试图进入B方法的线程就只能在等锁池(注意不是等待池哦)中等待对象的锁。

  填写下面表单即可预约申请免费试听java课程!害怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

  请说出与线程同步以及线程调度相关的方法。

  答:

  - wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁;

  - sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要处理InterruptedException异常;

  - notify():唤醒一个处于等待状态的线程,当然在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且与优先级无关;

  - notityAll():唤醒所有处于等待状态的线程,该方法并不是将对象的锁给所有线程,而是让它们竞争,只有获得锁的线程才能进入就绪状态;

  编写多线程程序有几种实现方式?

  答:一种是继承Thread类;另一种是实现Runnable接口。两种方式都要通过重写run()方法来定义线程的行为,推荐使用后者,因为Java中的继承是单继承,一个类有一个父类,如果继承了Thread类就无法再继承其他类了,显然使用Runnable接口更为灵活。

分享到

相关资讯