Java线程面试题 Top 50 (转载)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 (转载)的主要内容,如果未能解决你的问题,请参考以下文章