zoukankan      html  css  js  c++  java
  • 【Todo】Java线程面试题 Top 50 (转载)

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

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

    看过上面这篇,还有这一篇:http://www.tuicool.com/articles/VRVFZb  《40个多线程问题总结》

    不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题。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中实现线程?

    继续看这一篇:

    http://www.tuicool.com/articles/VRVFZb  《40个多线程问题总结》

  • 相关阅读:
    投影机的选择
    IOS 检测摇动
    MARK 我的第一个app完成
    2013年会抽奖程序
    给phpcms v9增加类似于phpcms 2008中的关键词表
    codeigniter 用.htcaccess做动态二级域名解析
    获取优酷、土豆、搜狐视频 HTML5视频m3u8格式源
    发现一个好的文学素材类网站
    mac MAMP下安装mongdb & RockMongo
    给artDialog 5.02 增加ajax get功能
  • 原文地址:https://www.cnblogs.com/charlesblc/p/6135488.html
Copyright © 2011-2022 走看看