Java 面试(多线程部分)

1.现在有 T1、T2、T3 三个线程,你怎样保证 T2 在 T1 执行完后执行,T3 在 T2 执行完后执行?

答:使用join()方法,让其强制运行,此线程强制运行期间,其他线程无法运行,必须等待此线程运行完成之后才能继续运行。

2.为什么我们要调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法?

答:直接调用run()方法,和其他方法没啥区别,程序在主线程上按顺序进行,没有多线程的概念。start()方法看源码则是调用了private native void start0();这个方法,这是一个native方法,调用了本地操作系统的底层函数实现的。从而让操作系统开启一个线程,此线程处于就绪状态,等待CPU进行调度。而实现runnable接口,run()方法中就是线程主体,是在线程获得CPU时间片时,被CPU进行调用运行的。也就是说,此时run()方法是线程处于运行状态下进行操作的。

3.在Javawait()sleep()方法的不同?

答:sleep()Thread类中定义的方法,而wait()Object类中的方法。sleep()方法为此线程睡眠一段时间,交出执行权,不会释放锁对象。进入到其他阻塞状态。可不在同步方法中执行。如果sleep()时间到,就会重新进入到就绪状态。而wait()notify()是联用的,只能在同步方法中使用。wait()则是交出执行权,交出锁对象,进入到等待阻塞状态。然后等着被notify()方法唤醒,进入到同步阻塞状态,拿到锁,然后进入就绪状态。

wait()方法和notify()方法:当一个线程执行到wait()方法时(线程休眠且释放机锁),它就进入到一个和该对象相关的等待池中,同时失去了对象的机锁。当它被一个notify()方法唤醒时,等待池中的线程就被放到了锁池中。该线程从锁池中获得机锁,然后回到wait()前的中断现场。

参考:
http://blog.csdn.net/lv1817/article/details/44904761
http://blog.csdn.net/liuguangqiang/article/details/49180319

4.为什么waitnotifynotifyAll这些方法不在Thread类里面?

答:要分析这个程序,首先要理解notify()wait(),因为这两个方法本来就不属于Thread类,而是属于最底层的Object基础类的,也就是说不光是Thread,每个对象都有notifywait的功能,为什么?因为他们是用来操纵锁的,而每个对象都有锁,锁是每个对象的基础,既然锁是基础的,那么操纵锁的方法当然也是最基础了。

另一种解释:一般来说,进行notifywait操作的时候,需要找一个两个线程共享的对象(即相同锁对象)。同时,这两个线程如果要同步的话,必须共享一个同步锁。通常就用共享的同步锁来通信,而同步锁可以任意对象。所以notifywait的机制必须在Object,必须让任意对象都有这种功能。

5.Thread类中的yield方法有什么作用?

答:yield()方法为线程的礼让。放弃此线程的执行权,放弃执行权之后,立马有资格被CPU调用,因为放弃之后就能立马进入到CPU可以执行的线程队列,所以有可能会发现放弃之后,却又立马执行的情况。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值