专栏
扫码关注公众号
既然 start() 方法会调用 run() 方法,为什么我们调用 start() 方法,而不直接调用 run() 方法?
这是一个基本的Java多线程面试题。一般在Java中级面试的电话面试或一轮面试中遇到。这道问题的答案是这样的:当你调用start()方法时,它会新建一个线程然后执行run()方法中的代码。如果直接调用run()方法,并不会创建新线程,方法中的代码会在当前调用者的线程中执行。
守护线程和非守护线程有怎么区别?
程序运行完毕,jvm会等待非守护线程完成后关闭,但是jvm不会等待守护线程。守护线程最典型的例子就是GC线程。
有哪两种创建线程的方式?这两种方式更优的是哪个?
两种方式:通过实现java.lang.Runnable或者通过扩展java.lang.Thread类。实现Runnable接口可能更优,原因:a、Java不支持多继承,因此扩展Thread类就代表这个子类不能扩展其他类。而实现Runnable接口的类还可能扩展另一个类;b、类可能只要求可执行即可,因此继承整个Thread类的开销过大。
一个线程如果出现了运行时异常怎么办?
如果该异常没有被捕获的话,这个线程就停止执行了。但是要注意:如果这个线程持有某个对象的监视器,则这个对象监视器会被立即释放。