多线程相关知识点(一)

  1. 并行和并发有什么区别?
    并行是指两个或者多个事件在同一时间点发生;而并发是指两个或多个事件在同一时间段发生。
    并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。
    并发的反义是顺序,并行的反义是串行。并发并行并不是互斥概念,只不过并发强调任务的抽象调度,并行强调任务的实际执行。

  2. 线程和进程的区别?
    进程是资源分配的最小单位,线程是程序执行的最小单位。
    进程有自己独立的地址空间,每启动一个进程,系统都会为其分配地址空间,建立数据表来维护代码段、堆栈段和数据段,线程没有独立的地址空间,它使用相同的地址空间共享数据;
    CPU切换一个线程比切换进程花费小;创建一个线程比进程开销小;

  3. 守护线程是什么?
    所谓守护线程是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程。当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。

  4. 创建线程有哪几种方式?
    (1)通过继承Thread类创建线程类
         步骤:
          a. 定义Thread类的子类FirstThread,并重写run()方法。run()方法的方法体(线程执行体)就是线程要执行的任务。
          b. 创建Thread子类的实例,即创建了线程对象。
          c. 调用子类实例的star()方法来启动线程。
        通过继承Thread类创建线程类时,多个线程之间无法共享该线程类的实例变量

      (2)实现Runnable接口方式创建线程类
         步骤:
          a. 定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。
          b. 创建 Runnable实现类的实例,并依此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。
          c. 调用线程对象的start()方法来启动该线程。
         Runnable可以实现资源共享

      (3)使用Callable和Future创建线程
         步骤:
          a. 创建Callable接口的实现类 ,并实现Call方法
          b. 创建Callable实现类的实现,使用FutureTask类包装Callable对象,该FutureTask对象封装了Callable对象的Call方法的返回值
          c. 使用FutureTask对象作为Thread对象的target创建并启动线程
          d. 调用FutureTask对象的get()来获取子线程执行结束的返回值
      (4)通过线程池创建线程

  5. runnable 和 callable 有什么区别?
    (1)Runnable执行方法是run(),Callable是call()
    (2)实现Runnable接口的任务线程无返回值;实现Callable接口的任务线程能返回执行结果
    (3)call()方法可以抛出受检查的异常,而run()方法不能抛出受检查的异常。
    Runnable和Callable的区别和用法

  6. 线程有哪些状态?
    线程的五大状态分别为:创建状态(New)、就绪状态(Runnable)、运行状态(Running)、阻塞状态(Blocked)、死亡状态(Dead)。
    线程的五大状态及其常用方法

  7. sleep() 和 wait() 有什么区别?
    (1)sleep()是线程类(Thread)的方法,调用会暂停此线程指定的时间,但监控依然保持,不会释放对象锁,到时间自动恢复;wait()是Object的方法,调用会放弃对象锁,进入等待队列,待调用notify()/notifyAll()唤醒指定的线程或者所有线程,才会进入锁池,不再次获得对象锁才会进入运行状态;(2)sleep()方法可以在任何地方使用;wait()方法则只能在同步方法或同步块中使用;

  8. notify()和 notifyAll()有什么区别?
    notify()和notifyAll()都是Object对象用于通知处在等待该对象的线程的方法。
    void notify(): 唤醒一个正在等待该对象的线程。注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
    void notifyAll(): 唤醒所有正在等待该对象的线程。注意!!并不是给所有唤醒线程一个对象的锁,而是让它们竞争,当其中一个线程运行完就开始运行下一个已经被唤醒的线程,因为锁已经转移了。
    notify()和notifyAll()主要区别

  9. 线程的 run()和 start()有什么区别?
    start():该方法是在当前线程中启动一个新的线程,而新启动的线程会调用run()方法,同时该方法不能重复调用;start()的作用是启动相应的线程
    run() :该方法和普通的方法一样,可以重复执行,不会创建新的线程。run()相当于线程的任务处理逻辑的入口方法

  10. 创建线程池有哪几种方式?
    (1)newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
    (2)newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
    (3) newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
    (4)newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
    线程池四种创建方法

  11. 线程池都有哪些状态?
    线程池的5种状态:Running、ShutDown、Stop、Tidying、Terminated。
    线程池的五种状态

  12. 线程池中 submit()和 execute()方法有什么区别?
    execute(Runnable x) 没有返回值。可以执行任务,但无法判断任务是否成功完成。——实现Runnable接口
    submit(Runnable x) 返回一个future。可以用这个future来判断任务是否成功完成。——实现Callable接口
    excute入参Runnable,submit入参可以为Callable

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值