线程与多线程

1、多线程两种实现方式
(1)继承Thread
    * 定义类继承Thread
    * 重写run方法
    * 把新线程要做的事写在run方法中
    * 创建线程对象
    * 开启新线程, 内部会自动执行run方法
(2)实现Runnable
    * 定义类实现Runnable接口
    * 实现run方法
    * 把新线程要做的事写在run方法中
    * 创建自定义的Runnable的子类对象
    * 创建Thread对象, 传入Runnable
    * 调用start()开启新线程, 内部会自动调用Runnable的run()方法
2、多线程的安全问题及解决方案
    问题:当多线程并发, 有多段代码同时执行时,数据会产生错乱。
    方案:我们希望某一段代码执行的过程中CPU不要切换到其他线程工作. 这时就需要同步。
3、死锁的产生原理
    多线程同步的时候, 如果同步代码嵌套, 使用相同锁, 就有可能出现死锁
4、多线程两种实现方式的区别
实现原理:
    继承Thread    :    由于子类重写了Thread类的run(), 当调用start()时, 直接找子类的run()方法
    实现Runnable:    构造函数中传入了Runnable的引用, 成员变量记住了它, start()调用run()方法时内部判断成员变量Runnable的引用是否为空, 不为空编译时看的是Runnable的run(),运行时执行的是子类的run()方法
优缺点:
    继承Thread    :
        好处:    可以直接使用Thread类中的方法,代码简单
        弊端:    如果已经有了父类,就不能用这种方法
    实现Runnable:
        好处:    即使自己定义的线程类有了父类也没关系,因为有了父类也可以实现接口,而且接口是可以多实现的
        弊端:    不能直接使用Thread中的方法需要先获取到线程对象后,才能得到Thread的方法,代码复杂

1、单例设计模式,适配器设计模式
    单利设计模式:    
        在java中,单例模式是指为了保证类在内存中只有一个对象,而形成的一种固有的代码模式!
    适配器设计模式:
        在java中,适配器设计模式是指为了监视某些行为,但是对于每种监听到的行为又有不同的处理,为了能够让监听者自行来处理监听到指定行为后,要做的后续操作,而形成的一种固有的代码模式!

    适配器标准课上答案:
        * a.什么是适配器
            * 在使用监听器的时候, 需要定义一个类事件监听器接口.
            * 通常接口中有多个方法, 而程序中不一定所有的都用到, 但又必须重写, 这很繁琐.
            * 适配器简化了这些操作, 我们定义监听器时只要继承适配器, 然后重写需要的方法即可.
        * b.适配器原理
            * 适配器就是一个类, 实现了监听器接口, 所有抽象方法都重写了, 但是方法全是空的.
            * 适配器类需要定义成抽象的,因为创建该类对象,调用空方法是没有意义的
            * 目的就是为了简化程序员的操作, 定义监听器时继承适配器, 只重写需要的方法就可以了.
2、饿汉式和懒汉式的区别
    使用场合:
        饿汉式:    开发用
        懒汉式:    面使用,开发一般不用
    思想:
        饿汉式:    类一加载就生成对象。
        懒汉式:    在调用获取对象的方法的时候生成。
    实用性:
        饿汉式:    安全,效率高。相对懒汉式会在未使用之前就占用内存。
        懒汉式:    存在线程安全漏洞,可以利用同步解决,但是效率会变低。内存方面符合了编程中的延迟加载思想。(在面试中面试官会比较希望答出这一点)
3、Timer类是干嘛的
    Timer类是计时器。
    一般的使用过程是在Timer类的schedule()方法中传入两个参数,一个TimerTask的子类对象,在这个子类对象中规定了计时结束的操作,另一个java.util.Date类的对象,其参数指定了计时的开始时间和循环周期,
4、wait和sleep的区别
    sleep方法:定义在Thread类中,让线程在指定时间内处于休眠状态,超时后继续向下执行,休眠的线程不会释放锁资源。
    wait方法 :定义在Object类中,让以当前对象为监视器的线程处于阻塞状态,不可获取执行权,在得到notify或者notifyAll的通知后再继续抢夺执行权。等待的线程会释放锁资源。
5、线程的生命周期(五中状态的切换流程)
    线程分为5个生命周期,新建,就绪,运行,阻塞,死亡
    其中:
        新建代表线程在内存中创建,对应start方法。
        就绪代表线程拥有抢夺执行权的资格,如果抢到就会执行线程中的内容
        运行代码线程中的内容正在执行。
            a:若被抢走执行权,回到就绪状态
            b:若执行ssleep、wait等方法,会进入阻塞状态。
        阻塞代表线程被强制不可进入就绪状态,对于非就绪状态的线程是没有机会抢夺执行权,也就更不可能进入运行状态了。
        死亡代表线程运行结束,也可能是被强制结束,一般不建议使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值