JAVA中的面试题-多线程

来源:互联网 发布:网络最火的手游 编辑:程序博客网 时间:2024/06/07 05:37

面试题1:Java中创建一个线程的方式有哪几种有什么区别?

1.集成Thread类 2.实现Runnable接口 3.实现Callable接口,它的call可以作为线程的执行体,Future接口作为作为call方法的返回值,只不过这种方法不经常使用。

区别:主要讲前两个方式的区别
区别1:
继承Thread类之后,可以直接调用start方法来启动当前线程(注意!不是调用run方法)
实现Runnable接口之后,该类只是作为Thread的类的目标来启动线程。new Thread(demo).start();
区别2:
当一个类想继承Thread类,那么前提是它不能集成别的类!而实现Runnable接口的对象没有这个限制,而且实现了Runnable接口之后,还可以实现别的接口。


面试题2. 如何停止一个正在运行的线程?

(1)方法1: 调用Thread.stop()方法停止线程。

Thread.stop()不安全,已不再建议使用。

该方法天生是不安全的。使用thread.stop()停止一个线程,导致释放(解锁)所有该线程已经锁定的监视器(因沿堆栈向上传播的未检查异常ThreadDeath而解锁)。如果之前受这些监视器保护的任何对象处于不一致状态,则不一致状态的对象(受损对象)将对其他线程可见,这可能导致任意的行为。

(2)方法2: Thread.interrupt()

传递InterruptedException。这是最明智的策略,将异常传递给方法的调用者。
恢复中断。在不能上抛的情况下,如Runnable方法,必须捕获InterruptedException,并通过当前线程的interrupt()方法恢复中断状态,这样在调用栈中更高层的代码将看到引发了一个中断。
(3)方法3:停止一个线程最佳实践是 中断 + 条件变量。

中断只是一种协作机制,需要被中断的线程自己处理中断。

停止一个线程最好的做法就是利用共享的条件变量。

0 0
原创粉丝点击