多线程(七)多线程总结及面试题

版权声明: https://blog.csdn.net/qq_33278885/article/details/81697311

多线程面试题:

1:多线程有几种实现方案,分别是哪几种?
    两种。
    
    继承Thread类
    实现Runnable接口
    
    扩展一种:实现Callable接口。这个得和线程池结合。

2:同步有几种方式,分别是什么?
    两种。
    
    同步代码块
    同步方法

3:启动一个线程是run()还是start()?它们的区别?
    start();
    
    run():封装了被线程执行的代码,直接调用仅仅是普通方法的调用
    start():启动线程,并由JVM自动调用run()方法

4:sleep()和wait()方法的区别
    sleep():必须指时间;    不释放锁。
    wait():可以不指定时间,也可以指定时间;   释放锁。

5:为什么wait(),notify(),notifyAll()等方法都定义在Object类中
    因为这些方法的调用是依赖于锁对象的,而同步代码块的锁对象是任意锁。
    而Object代码任意的对象,所以,定义在这里面。

6:线程的生命周期图
    新建 -- 就绪 -- 运行 -- 死亡
    新建 -- 就绪 -- 运行 -- 阻塞 -- 就绪 -- 运行 -- 死亡
    建议:画图解释。

--------------------------------------------------------------------------总结---------------------------------------------------------------------------------

《1部分》

1:多线程(理解)
    (1)多线程:一个应用程序有多条执行路径
        进程:正在执行的应用程序
        线程:进程的执行单元,执行路径
        单线程:一个应用程序只有一条执行路径
        多线程:一个应用程序有多条执行路径
        
        多进程的意义?
            提高CPU的使用率
        多线程的意义?
            提高应用程序的使用率
    (2)Java程序的运行原理及JVM的启动是多线程的吗?
        A:Java命令去启动JVM,JVM会启动一个进程,该进程会启动一个主线程。
        B:JVM的启动是多线程的,因为它最低有两个线程启动了,主线程和垃圾回收线程。
    (3)多线程的实现方案(自己补齐步骤及代码    掌握)
        A:继承Thread类
        B:实现Runnable接口
    (4)线程的调度和优先级问题
        A:线程的调度
            a:分时调度
            b:抢占式调度 (Java采用的是该调度方式)
        B:获取和设置线程优先级
            a:默认是5
            b:范围是1-10
    (5)线程的控制(常见方法)
        A:休眠线程
        B:加入线程
        C:礼让线程
        D:后台线程
        E:终止线程(掌握)
    (6)线程的生命周期(参照    线程生命周期图解.bmp)
        A:新建
        B:就绪
        C:运行
        D:阻塞
        E:死亡
    (7)电影院卖票程序的实现
        A:继承Thread类
        B:实现Runnable接口
    (8)电影院卖票程序出问题
        A:为了更符合真实的场景,加入了休眠100毫秒。
        B:卖票问题
            a:同票多次
            b:负数票
    (9)多线程安全问题的原因(也是我们以后判断一个程序是否有线程安全问题的依据)
        A:是否有多线程环境
        B:是否有共享数据
        C:是否有多条语句操作共享数据
    (10)同步解决线程安全问题
        A:同步代码块
            synchronized(对象) {
                需要被同步的代码;
            }
            
            这里的锁对象可以是任意对象。
            
        B:同步方法
            把同步加在方法上。
            
            这里的锁对象是this
            
        C:静态同步方法
            把同步加在方法上。
            
            这里的锁对象是当前类的字节码文件对象(反射再讲字节码文件对象)
    (11)回顾以前的线程安全的类
        A:StringBuffer
        B:Vector
        C:Hashtable
        D:如何把一个线程不安全的集合类变成一个线程安全的集合类
            用Collections工具类的方法即可。

《2部分》

1:多线程(理解)
    (1)JDK5以后的针对线程的锁定操作和释放操作
        Lock锁
    (2)死锁问题的描述和代码体现
    (3)生产者和消费者多线程体现(线程间通信问题)
        以学生作为资源来实现的
        
        资源类:Student
        设置数据类:SetThread(生产者)
        获取数据类:GetThread(消费者)
        测试类:StudentDemo
        
        代码:
            A:最基本的版本,只有一个数据。
            B:改进版本,给出了不同的数据,并加入了同步机制
            C:等待唤醒机制改进该程序,让数据能够实现依次的出现
                wait()
                notify()
                notifyAll() (多生产多消费)
            D:等待唤醒机制的代码优化。把数据及操作都写在了资源类中
    (4)线程组
    (5)线程池
    (6)多线程实现的第三种方案
    (7)多线程的面试题

2:设计模式(理解)
    (1)面试对象的常见设计原则
        单一
        开闭
        里氏
        依赖注入
        接口
        迪米特
    (2)设计模式概述和分类
        A:经验的总结
        B:三类
            创建型
            结构型
            行为型
    (3)改进的设计模式
        A:简单工厂模式
        B:工厂方法模式
        C:单例模式(掌握)
            a:饿汉式
            b:懒汉式
    (4)Runtime
        JDK提供的一个单例模式应用的类。
        还可以调用dos命令。
            

猜你喜欢

转载自blog.csdn.net/qq_33278885/article/details/81697311