第一期:Java面试 - 100题,梳理各大网站优秀面试题。大家可以跟着我一起来刷刷Java理论知识

[011] - JavaSE面试题(十一):多线程(1)

第1问:线程和进程的区别?

进程:具有一定独立功能的程序关于某个数据集合上的一次运行活动,是操作系统进行资源分配和调度的一个独立单位

线程:是进程的一个实体,是 cpu 调度和分派的基本单位,是比进程更小的可以独立运行的基本单位

特点:

  • 线程的划分尺度小于进程,这使多线程程序拥有高并发性,

  • 进程在运行时各自内存单元相互独立,线程之间内存共享,

  • 这使多线程编程可以拥有更好的性能和用户体验

第2问:一个Java应用程序至少有几个线程?

两个:

  • 主线程:负责main方法代码的执行,

  • 垃圾回收器线程:负责了回收垃圾。

第3问:如何停止一个线程?

  • Thread.stop(),不建议使用

  • 通过一个变量去控制,当符合这个条件时,自动结束。

  • interrupt()

第4问:sleep() 和 wait() 有什么区别?

sleep()方法:

  • Thread类中的静态方法

  • 当一个线程调用sleep()方法以后,不会释放同步资源锁,其他线程仍然会等待资源锁的释放

wait()方法:

  • Object类提供的一个普通方法
  • 而且必须同同步资源锁对象在同步代码块或者同步方法中调用。
  • 当调用wait()方法后,当前线程会立刻释放掉同步锁资源。其他线程就有机会获得同步资源锁从而继续往下执行

第5问:多线程的创建方式?

方式一:继承 Thread 类

Thread 本质上也是实现了 Runnable 接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过 Thread 类的 start()实例方法。start()方法是一个 native 方法,它将启动一个新线程,并执行 run()方法。这种方式实现多线程很简单,通过自己的类直接 extend Thread,并重写 run()方法,就可以启动新线程并执行自己定义的 run()方法。例如:继承 Thread 类实现多线程,并在合适的地方启动线程

方式二:实现 Runnable

接口的方式实现多线程,并且实例化 Thread,传入自己的 Thread 实例,调用 run( )方法

方式三:通过Callable和Future创建线程

第6问:谈谈你对线程池的理解?jdk提供了哪几种线程池?他们有什么区别?

线程池可以提高线程的创建和销毁的开销

jdk提供了以下几种线程池:

  • new SingleThreadExecutor(单线程的线程池 只有一个线程在执行,相对于单线程执行任务
  • new FixedThreadPool(固定线程数的线程池) 固定线程数处理任务;当任务过多,则固定的线程数谁先执行完任务,就执行剩余任务
  • new ScheduledThreadPool(控制线程池定时周期任务执行)
  • new CachedThreadPool(可缓存的线程池)

一般工作中使用的是new ThreadPoolExecutor

第7问:说一下ThreadPoolExecutor各个参数的含义?

第10问:说一下线程的生命周期?

  • 新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread thread= new MyThread();
  • 就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是说执行了t.start()此线程立即就会执行;
  • 运行状态(Running):当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。
  • 阻塞状态(Blocked):处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才有机会再次被CPU调用以进入到运行状态。根据阻塞产生的原因不同,阻塞状态又可以分为三种:

①等待阻塞:运行状态中的线程执行wait()方法,使本线程进入到等待阻塞状态;
②同步阻塞:线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态;
③其他阻塞:通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

  • 死亡状态(Dead)线程执行完了或者因异常退出了run()方法,该线程结束生命周期

注意:就绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中

【011】JavaSE面试题(十一):多线程(1)的更多相关文章

  1. 【012】JavaSE面试题(十二):多线程(2)

    第一期:Java面试 - 100题,梳理各大网站优秀面试题.大家可以跟着我一起来刷刷Java理论知识 [012] - JavaSE面试题(十二):多线程(2) 第1问:多线程的创建方式? 方式一:继承 ...

  2. JavaSE面试题

    JavaSE面试题 欢迎到我的Git仓库去提交您觉得优秀的内容! 1.是否可以从一个static方法内部发出对非static方法的调用? 不可以.当一个static方法被调用时,可能还没有创建任何实例 ...

  3. [010] - JavaSE面试题(十):集合之Map

    第一期:Java面试 - 100题,梳理各大网站优秀面试题.大家可以跟着我一起来刷刷Java理论知识 [010] - JavaSE面试题(十):集合之Map 第1问:HashMap和HashTable ...

  4. [005] - JavaSE面试题(五):String类

    第一期:Java面试 - 100题,梳理各大网站优秀面试题.大家可以跟着我一起来刷刷Java理论知识 [005] - JavaSE面试题(五):String类 第1问:String.StringBuf ...

  5. [001] - JavaSE面试题(一):面向对象

    第一期:Java面试 - 100题,梳理各大网站优秀面试题.大家可以跟着我一起来刷刷Java理论知识 [001] - JavaSE面试题(一):面向对象 第1问:面向对象和面向过程的区别? 面向过程 ...

  6. JavaSE 面试题: 类初始化和实例初始化等

    JavaSE 面试题 类初始化和实例初始化等 class Father { private int i = test(); private static int j = method(); stati ...

  7. JavaSE 面试题: 成员变量与局部变量

    JavaSE 面试题 成员变量与局部变量 public class Test { static int s; int i; int j; { int i = 1; i++; j++; s++; } p ...

  8. JavaSE 面试题: 方法的参数传递机制

    JavaSE 面试题 方法的参数传递机制 import java.util.Arrays; public class Test { public static void main(String[] a ...

  9. JavaSE 笔试题: 自增变量

    JavaSE 笔试题 自增变量 public class Test { public static void main(String[] args) { int i = 1; i = i++; int ...

随机推荐

  1. MindSpore算子支持类

    MindSpore算子支持类 Q:在使用Conv2D进行卷积定义的时候使用到了group的参数,group的值不是只需要保证可以被输入输出的维度整除即可了吗?group参数的传递方式是怎样的呢? A: ...

  2. 不是都需要ARM吗?

    不是都需要ARM吗? ARM系统架构简介 什么是ARM处理器,为什么没有听说? ARM-缩写:Advanced RISC Machines 该处理器起源于1984年的英格兰.在成立之初,ARM代表Ac ...

  3. 嵌入式Linux设备驱动程序:在运行时读取驱动程序状态

    嵌入式Linux设备驱动程序:在运行时读取驱动程序状态 Embedded Linux device drivers: Reading driver state at runtime 在运行时了解驱动程 ...

  4. (5)使用自定Web根目录

    调整 Web 站点 http://server0.example.com 的网页目录,要求如下: 1) 新建目录 /webroot,作为此站点新的网页文件根目录 # mkdir /webroot # ...

  5. 【NX二次开发】镜像对象

    使用uf5946获取镜像矩阵注意:uf5946镜像这个函数,只能用#define UF_plane_type=46这种类型的数据作为镜像面,不能用#define UF_datum_plane_type ...

  6. string大小写转换

    string大小写转换 源码: 1 #include <string> 2 #include <iostream> 3 #include <algorithm> 4 ...

  7. C# —— 点击按钮动态打开ComboBox

    网上搜索了好多资料,大多是重绘ComboBox或者使用自定义控件创建一个全新的ComboBox(并非基于window的ComboBox). 对于菜鸟的我,实现太麻烦,有些代码理解起来困难,但是项目比较 ...

  8. 打开黑盒:从 MySQL架构设计出发,看它是如何执行一条 SQL语句的

    1.把MySQL当个黑盒子一样执行SQL语句 我们的系统采用数据库连接池的方式去并发访问数据库,然后数据库自己其实也会维护一个连接池,其中管理了各种系统跟这台数据库服务器建立的所有连接 当我们的系统只 ...

  9. Java语言实现二维码的生成

    众所周知,现在生活中二维码已经是无处不见.走在街道上,随处可见广告标语旁有二维码,手机上QQ,微信加个好友都能通过二维码的方式,我不知道是什么时候兴起的二维码浪潮,但是我知道,这在我小时候可是见不到的 ...

  10. [Abp vNext 源码分析] - 20. 电子邮件与短信支持

    一.简介 ABP vNext 使用 Volo.Abp.Sms 包和 Volo.Abp.Emailing 包将短信和电子邮件作为基础设施进行了抽象,开发人员仅需要在使用的时候注入 ISmsSender ...