进程和线程

面试题

进程和线程的区别是什么?

  • 进程是执行着的应用程序,而线程是进程内部的一个执行序列。
  • 一个进程可以有多个线程。线程又叫做轻量级进程。

线程与进程的区别归纳:

  • a.地址空间和其它资源:进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。
  • b.通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。
  • c.调度和切换:线程上下文切换比进程上下文切换要快得多。
  • d.在多线程OS中,进程不是一个可执行的实体。

创建线程有几种不同的方式?

  • 有4种方式可以用来创建线程:
  • 继承Thread类
  • 实现Runnable接口
  • 应用程序可以使用Executor框架来创建线程池
  • 还有一种方式是实现Callable接口

常用的创建线程方式

  • 实现Runnable接口这种方式更受欢迎,因为这不需要继承Thread类。
  • 在应用设计中已经继承了别的对象的情况下,这需要多继承(而Java不支持多继承),只能实现接口。
  • 同时,线程池也是非常高效的,很容易实现和使用。

线程的几种可用状态

  1. 新建( new ):新创建了一个线程对象。
  2. 可运行( runnable ):线程对象创建后,其他线程(比如 main 线程)调用了该对象 的 start ()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取 cpu 的使用权 。
  3. 运行( running ):可运行状态( runnable )的线程获得了 cpu 时间片( timeslice ) ,执行程序代码。
  4. 阻塞( block ):阻塞状态是指线程因为某种原因放弃了 cpu 使用权,也即让出了 cpu timeslice ,暂时停止运行。直到线程进入可运行( runnable )状态,才有 机会再次获得 cpu timeslice 转到运行( running )状态。
  5. 死亡( dead ):线程 run ()、 main () 方法执行结束,或者因异常退出了 run ()方法,则该线程结束生命周期。死亡的线程不可再次复生。

阻塞的情况分三种:

  • 等待阻塞:运行( running )的线程执行 o . wait ()方法, JVM 会把该线程放 入等待队列( waitting queue )中。
  • 同步阻塞:运行( running )的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池( lock pool )中。
  • 其他阻塞:
    运行( running )的线程执行 Thread . sleep ( long ms )或 t . join ()方法,或者发出了 I / O 请求时, JVM会把该线程置为阻塞状态。
    当 sleep ()状态超时、 join ()等待线程终止或者超时、或者 I / O 处理完毕时,线程重新转入可运行( runnable )状态。

同步方法和同步代码块的区别是什么?

  • 同步方法默认用this或者当前类class对象作为锁
  • 同步代码块可以选择以什么来加锁,比同步方法要更细颗粒度,我们可以选择只同步会发生同步问题的部分代码而不是整个方法
  • 同步方法使用关键字 synchronized修饰方法,而同步代码块主要是修饰需要进行同步的代码,用 synchronized(object){代码内容}进行修饰

在监视器(Monitor)内部,是如何做线程同步的?程序应该做哪种级别的同步?

  • 监视器和锁在Java虚拟机中是一块使用的。
  • 监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块。
  • 每一个监视器都和一个对象引用相关联。线程在获取锁之前不允许执行同步代码。

posted @ 2021-01-10 14:00  张三丰学Java  阅读(121)  评论(0编辑  收藏  举报