JAVA面试基础

JAVA面试部分重点内容

三、多线程

  1.说说多线程的优缺点?

优点缺点
系统资源得到更合理的利用需要更多的内存空间来支持多线程
程序设计更加简洁多线程并发访问的情况可能会影响数据的准确性
程序响应更快,运行效率更高数据被多线程共享,可能会出现死锁的情况

  2.说说进程和线程的区别?

  • 进程:进程就是计算机正在运行的一个独立的应用程序。进程是一个动态的概念,当我们启动某个应用的时候,进程就产生了,当我们关闭该应用的时候,进程就结束了。进程的生命周期就是我们在使用该软件的整个过程。
  • 线程线程是组成进程的基本单位,可以完成特定的功能,一个进程是由一个或多个线程组成的。

  3.说说多线程的含义?

  多线程是指在一个进程中,多个线程同时执行:系统会为每个线程分配CPU资源,在某个具体的时间段内CPU资源会被一个线程占用,在不同的时间段内由不同的线程来占用资源,所以是多个线程交替执行,只不过CPU运行的速度太快,感觉是在同时执行。

  4.说说多线程的使用方式?

  • 继承Thread类
    1、创建自定义并继承Thread类
    2、重写Thread类中的run()方法
    3、调用start方法
  • 实现Runnable接口
    注意:不能通过run方法调用线程的任务,因为run方法调用相当于普通对象的执行,并不会抢占CPU的资源,只有调用start方法才能开启线程,进而去抢占CPU资源,当某个线程抢占到CPU资源后,会自动调用run方法。实现Runnable的 耦合度更低。

  5.说说线程和任务的区别?

  线程是去抢占CPU资源的,任务是具体执行业务逻辑的,线程内部会包含一个任务,线程启动(start),当抢占到资源之后,任务就开始执行(run)。

  • MyThread:继承Thread类,直接在类中重写run方法,首先实例化MyThread,start即可,因为Thread内部存在Runnable。
  • MyRunnable:实现Runnable接口的方法,在实现类中重写run方法,首先创建Thread对象,并将MyRunnable注入到Thread中,Thread.start。

  6.线程的五种状态?

   线程共有5种状态,在特定的情况下,线程可以在不同的状态之间切换,5种状态如下所示。

  • 创建状态:实例化一个新的线程对象,还未启动;
  • 就绪状态:创建好的线程对象调用 start方法完成启动,进入线程池等待抢占CPU资源;
  • 运行状态:线程对象获取了CPU资源,在一定的时间内执行任务。
  • 阻塞状态:正在运行的线程暂停执行任务,释放所占用的CPU资源,并在解除阻塞状态之后也不能直接回到运行状态,而是重新回到就绪状态,等待获取CPU资源。
  • 终止状态:线程运行完毕或因为异常导致该线程终止运行。
    在这里插入图片描述

  7.线程调度的用法?

  • 线程休眠:让当前线程暂停执行,而运行状态进入到阻塞状态,将CPU资源让给其他线程的调度方式,通过sleep(long millis)实现,单位为毫秒。
    注意:在外部调用需要注意把休眠放在启动之前,通过静态方式调用sleep()可让主线程休眠。sleep()是静态本地方法,可以通过类调用,也可以通过对象调用,方法定义抛出 Interrupted Exception,Interrupted Exception继承 Exception,外部调用时必须手动处理异常。
  • 线程合并:合并是指将指定的某个线程加入到当前线程中,合并为一个线程,由两个线程交替执行变成一个线程中的两个自线程顺序执行。通过调用join方法来实现合并,线程甲和线程乙,线程甲执行到某个时间点的时候调用线程乙的join方法,则表示从当前时间点开始CPU资源被线程乙独占,线程甲进入阻塞状态,直到线程乙执行完毕,线程甲进入就绪状态,等待获取CPU资源进入运行状态;join方法重载,join()表示乙线程执行完毕之后才能执行其他线程,join(long millis)表示乙线程执行millis毫秒之后,无论是否执行完毕,其他线程都可以和它争夺CPU资源。
  • 线程礼让:线程礼让是指在某个特定的时间点,让线程暂停抢占CPU资源的行为,运行状态/就绪状态->阻塞状态,将CPU资源让给其他线程来使用。假如线程甲和线程乙在交替执行,某个时间点线程甲做出了礼让,所以在这个时间节点线程乙拥有了CPU资源,执行业务逻辑,但不代表线程甲一直暂停执行。线程甲只是在特定的时间节点礼让,过了时间节点,线程甲再次进入就绪状态,和线程乙争夺CPU资源,通过yield方法实现
  • 线程中断:有很多种情况会造成线程停止运行
    1、线程执行完毕自动停止
    2、线程执行过程中遇到错误抛出异常并停止
    3、线程执行过程中根据需求手动停止
      Java中实现线程中断有如下几个常用方法
public void stop()stop方法在新版本的JDK已经不推荐使用,重点关注后两个方法。
public void interrupt()是一个实例方法,当线程对象调用该方法时,表示中断当前线程对象
public boolean isInterrupted()获取当前线程对象的标志位:true表示清除了标志位,当前线程已经中断; false表示没有清除标志位

  当一个线程对象处于不同的状态时,中断机制也是不同的

  8.线程同步的用法?

  线程同步的本质是锁定多个线程所共享的资源,Synchronized还可以修饰代码块,为代码加上内置锁,从而实现同步。无论是锁定方法还是锁定对象,锁定类,只需要分析这个方法,对象,类在内存有几份即可。对象一般都是多份,类一定是一份。方法就看是静态方法还是非静态方法,静态方法一定是一份,非静态方法一般是多份。

  9.说说线程的单例模式?

   单例模式核心思想是一个类只有一个实例对象
在这里插入图片描述
volatile的使用的时候可以使主内存的数据对象对线程可见

  10.说说线程的并发和并行?

  • 并发:多个线程访问同一个共享资源,前提是计算机是单核CPU,多个线程不是同时在访问,而是交替进行,只是因为CPU运行速度太快,看起来是同时运行。
  • 并行:多核CPU,多个线程是真正在同时运行,各自占用不同的CPU,相互之间没有影响,也不会争夺资源。
  • java默认线程有两个,main(主线程),GC(垃圾回收机制)
  • synchronized关键字实现线程同步,让在访问同一个资源的多线程排队去完成业务,避免出现数据错乱的情况。

  11.说说死锁DeadLock?

  • 前提:一个线程完成业务需要同时访问两个资源
  • 死锁:多个线程在同时完成业务,出现争抢资源的情况

  12.说说重入锁和 synchronized的区别?

ReentrantLockSynchronized
ReentrantLock是一个类Synchronized是一个关键字
ReentrantLock是JDK实现Synchronized是JVM实现
ReentrantLock需要手动释放锁Synchronized可以自动释放锁
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值