Java 并发面试题(一)
在我招聘和找工作的过程中,java 并发是非常重要的考察内容。
这篇文章中的面试题目来自并发编程,非常好的学习网站,题目来源 http://ifeve.com/javaconcurrency-interview-questions-base/
a. 多线程基础
0. java中有几种方法可以实现一个线程?
在我招聘的过程中,大部分面试者都只能回答继承 Thread 类,这个回答是不能让面试官满意的。由于 java 的单继承特性,如果继承 Thread 类之后,自身创建的线程类就失去了灵活性,因此更好的方法是实现 Runnable 接口,实际上 Thread 类也是实现了 Runnable 接口。
那么如何启动线程呢?先看 Thread 类
1 public class MyThread extends Thread { 2 3 @Override 4 public void run() { 5 System.out.println(currentThread().getId() + " ----> running"); 6 } 7 8 public static void main(String[] args) { 9 Thread th1 = new MyThread(); 10 Thread th2 = new MyThread(); 11 th1.start(); 12 th2.start(); 13 } 14 }
运行结果:
9 ----> running 10 ----> running
从这个简单的例子可以看出,Thread 类启动线程是通过调用 start() 方法实现的,而 Runnable 接口只提供了 run() 方法。所以第二个问题来了
1. start() 方法和 run() 有什么区别?
从 JDK 7 文档中可以看到 start() 方法创建了一个新的线程并调用了 run() 方法,如果直接在代码中调用 run() 方法,那么实际上是在当前线程执行而没有创建新的线程。
那么如何启动实现 Runnable 接口的线程呢?可以对上面的例子进行修改,Thread 类的构造方法可以允许传入一个 Runnable 对象,利用这一点

浙公网安备 33010602011771号