java 多线程

来源:互联网 发布:linux 进城kill不掉 编辑:程序博客网 时间:2024/06/06 06:56

Java多线程项目中用到的较少,一般用到了都是业务比较复杂,或者时效以及响应速度要求较高。但是Java多线程是每一个程序员都得深入了解一下的,因为面试的时候百分百会用到。

  1. 什么是线程
    线程是指在程序在执行过程中,能够执行代码的一个执行单元,是cpu调度和分配的基本单位,线程基本不拥有系统资源,只拥有运行中不可少的资源(计数器等)。
  2. 线程与进程的区别
    进程是指一段正在执行的程序。一个进程可以包含做个线程。在操作系统级别上,程序的执行都是以进程为单位的。
  3. 使用多线程有什么好处以及缺点
    使用多线程的好处如下:
    3.1提高cpu使用效率,在资源有限的情况下使效率最大化
    3.2减少响应时间,提高程序执行效率
    3.3使用多线程能够简化程序结构,是一个复杂的程序能够分成多个 线程执行,必须计时,单线程要判断时分秒,多线程可以时分秒建立三个线程
    使用多线程也会带来一些坏处,如下:
    3.1安全性的问题
    3.2性能问题,频繁的创建销毁线程,或者不合理的使用,都会造成性能问题
    3.3活跃性问题,容易出现死锁等问题
  4. 实现多线程的方式
    Java多线程实现方式一般有三种:
    4.1.继承Thread,重写run方法
    4.2.实现Runable接口,并实现该接口的run方法
    4.3.实现Callable接口,重写call()方法
    三者还有各有各的好处,Thread也是实现了Runable接口
    Java由于单继承的原因,在实现多线程的同时如果需要继承多个类,那么就需要使用Runable接口
    Callable比Runable拥有更强大的功能
    1.Callable可以在任务结束后提供一个返回值
    2.Callable的call方法可以抛异常,Runable的run方法不行
    3.运行Callable可以得到一个Future对象,Future对象表示异步计算的结果,它提供了检查计算是否完成的方法

  5. 多线程常见面试题
    一、同步和异步的区别
    同步与异步都是在多线程中体现出来的,同步要求有严格的执行顺序,只有在等到响应后才能继续执行,而异步则可以各自执行各自的,相互不干扰,且能同时执行。如你喊我吃饭,同步–我没去你就一直喊,知道我去跟你一起吃饭,异步–喊完就走,我可以马上跟你去吃,也可以以后随时去吃
    二、run方法与start方法的区别
    run:
    使用当前线程执行run方法,相当于调用了run方法
    start:
    开启新线程,执行run方法,开启多线程,必须使用start
    三、sleep方法与wait方法的区别
    都是用来使线程暂停执行的方法
    1.原理不同
    sleep是Thread的静态方法,是线程用来控制自身流程的。他会使线程暂停执行一段时间,而把执行机会让给其他线程,等时间到后,此线程会自动“苏醒”
    wait是Object的方法,用于线程间通信,这个方法使当前拥有该对象锁的进程等待,知道其他线程notify或者notifyAll唤醒,开发员也可以设置一段时间使其自动“苏醒”
    2.对锁的处理机制不同
    sleep是暂停一段时间,不会释放锁
    wait是线程进入“休眠”,会释放锁,“唤醒”后重新竞争锁
    3.使用区域不同
    由于wait的特殊意义,因此他必须放在同步方法或者同步语句块中使用,而sleep可以放在任何地方
    4.sleep必须捕获异常,wait不用
    四、synchronized与lock有什么异同
    都是用来在多线程执行时实现同步的功能
    1.用法不一样
    在需要同步的对象中加入synchronized控制,synchronized既可以加载方法上,也可以加在特定的代码块中,括号中表示需要锁的对象,而lock需要显示的指定其实位置与终止位置,synchronized是托管给jvm执行的,而lock是通过代码实现的,它比synchronized有更精确的线程语义
    2.性能不一样
    synchronized在资源竞争不是很激烈的情况下,性能优于lock
    但是在资源竞争激烈的情况下,synchronized的性能下降很快,lock的基本保持不变
    3.锁机制不一样
    synchronized获得锁和释放锁的方式都是在块结构中,当获取多个锁时,必须以相反的顺序释放,并且是自动解锁的,不会出现异常而导致锁没有被释放而引起死锁
    lock则需要开发员手动释放,必须在finally中释放,否则会引起死锁
    五、join方法的作用
    jion方法的作用是让调用该方法的线程在执行完run方法后再执行jion后面的代码,也就是调用jion方法的线程插队执行。