首页 > 代码库 > Java线程面试题 Top 50 (转载)

Java线程面试题 Top 50 (转载)

原文链接:http://www.importnew.com/12773.html

这里有一个排版好看一点的:http://www.cnblogs.com/dolphin0520/p/3958019.html

 

不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题。Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎。大多数待遇丰厚的Java开发职位都要求开发者精通多线程技术并且有丰富的Java程序开发调试优化经验,所以线程相关的问题在面试中经常会被提到。

 

在典型的Java面试中, 面试官会从线程的基本概念问起, 如:为什么你需要使用线程, 如何创建线程,用什么方式创建线程比较好(比如:继承thread类还是调用Runnable接口)

注:

1. 实现Runnable接口,可以再多继承其他的类,这一点比继承thread更好。

2. 继承thread,多线程是new多个子类的实例;实现Runnable,是new 一个实现了Runnable的实例,创建多个Thread实例,把Runnable实例传进去。

大多数情况下,如果只想重写 run() 方法,而不重写其他 Thread 方法,那么应使用 Runnable 接口。这很重要,因为除非程序员打算修改或增强类的基本行为,否则不应为该类(Thread)创建子类。

 

这样,多个Thread实例,就共享了Runnable实例的数据。(但是强烈不推荐Runnable实例里面放数据,同步机制不完善,同样需要考虑同步的

参考这里(Link), Run方法也是可以加上synchronized的,表示对对象加锁。

见例子:

class MyRunnable implements Runnable {

    int x = 5;
    @Override
    public void run() {
        for (int i=0; i<5; i++) {
            System.out.println("hi " + Thread.currentThread().getName() + ":" + x--);
        }
    }
}

public class Main {

    public static void main(String[] args) throws InterruptedException {

        MyRunnable mr = new MyRunnable();
        Thread t1 = new Thread(mr, "1");
        Thread t2 = new Thread(mr, "2");
        Thread t3 = new Thread(mr, "3");

        t1.start();
        t2.start();
        t3.start();

        System.out.println();

    }
}

结果:

hi 1:5
hi 2:4
hi 1:3
hi 1:1
hi 1:0
hi 3:-1
hi 3:-3
hi 3:-4
hi 3:-5
hi 3:-6

hi 2:2
hi 2:-7
hi 2:-8
hi 2:-9
hi 1:-2

发现是混乱的。

而如果对run方法加上synchronized,如下:

public synchronized void run() {
......
}

结果:
hi 1:5
hi 1:4
hi 1:3
hi 1:2
hi 1:1
hi 2:0
hi 2:-1
hi 2:-2
hi 2:-3
hi 2:-4
hi 3:-5
hi 3:-6
hi 3:-7
hi 3:-8
hi 3:-9

可以看到,是线程1先打印5个,然后线程2打印。因为加锁了。

 

 

然后逐渐问到并发问题像在Java并发编程的过程中遇到了什么挑战,Java内存模型,JDK1.5引入了哪些更高阶的并发工具,并发编程常用的设计模式,经典多线程问题如生产者消费者,哲学家就餐,读写器或者简单的有界缓冲区问题。仅仅知道线程的基本概念是远远不够的, 你必须知道如何处理死锁,竞态条件,内存冲突和线程安全等并发问题。掌握了这些技巧,你就可以轻松应对多线程和并发面试了。

 

1) 什么是线程?

线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒。Java在语言层面对多线程提供了卓越的支持,它也是一个很好的卖点。

 

2) 线程和进程有什么区别?

线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据。

线程进程进一步区别参考这里:http://www.cnblogs.com/charlesblc/p/6135666.html

3) 如何在Java中实现线程?

 

Java线程面试题 Top 50 (转载)