Java——多线程常见面试题

1)     现在有T1T2T3三个线程,你怎样保证T2T1执行完后执行,T3T2执行完后执行?


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

        start()用来启动一个线程,当调用start()方法时,系统才会开启一个线程,通过Thead类中start()方法来启动的线程处于就绪状态(可运行状态),此时并没有运行,一旦得到CPU时间片,就自动开始执行run()方法。此时不需要等待run()方法执行完也可以继续执行下面的代码,所以也由此看出run()方法并没有实现多线程。

     run()方法是在本线程里的,只是线程里的一个函数,而不是多线程的。如果直接调用run(),其实就相当于是调用了一个普通函数而已,直接待用run()方法必须等待run()方法执行完毕才能执行下面的代码,所以执行路径还是只有一条,根本就没有线程的特征,所以在多线程执行时要使用start()方法而不是run()方法。


3) javawaitsleep方法的不同? 

 Thread类的方法:sleep(),yield()
 Object的方法:wait()notify()

 sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep 不会释放对象锁。

 wait 是Object 类的方法,对此对象调用wait 方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify 方法(或notifyAll)后本线程才进入对象锁定池准备获得对

象锁进入运行状态。

1、这两个方法来自不同的类分别是Thread和Object

扫描二维码关注公众号,回复: 1592279 查看本文章

2、最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。

3、wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围)

4、sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常



  4)    为什么wait, notify  notifyAll这些方法不在thread类里面?

     简单的说,由于wait,notify和notifyAll都是锁级别的操作,所以把他们定义在Object类中,因为锁属于对象 wait(),notify(),notifyAll()不属于Thread类,而是属于Object基础类,也就是说每个对 象都有wait(),notify(),notifyAll()的功能.因为每个对象都有锁,锁是每个对象的基础,当然操作锁的方法也是最基础了。wait导致当前的线程等待,直到其他线程调用此对象的  notify()  方法或 notifyAll() 方法,或被其他线程中断。wait只能由持有对像锁的线程来调用。 notify唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程(随机)。直到当前的线程放弃此对象上的锁,才能继续执行被唤醒的线程。同Wait方法一样,notify只能由持有对像锁的线程来调用.notifyall也一样,不同的是notifyall会唤配所有在此对象锁上等待的线程。 "只能由持有对像锁的线程来调用"说明wait方法与notify方法必须在同步块内执行,即synchronized(obj)之内.再者synchronized代码块内没有锁是寸步不行的,所以线程要继续执行必须获得锁。相辅相成。


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

    Yield()方法是停止当前线程,让同等优先权的线程运行。如果没有同等优先权的线程,那么Yield()方法将不会起作用。



猜你喜欢

转载自www.cnblogs.com/meihao1203/p/9181839.html