线程基础三问——猫眼真题
线程基础三问——猫眼真题
线程和进程是项目中常遇到的知识点,面试官对此也是对此类知识点经常考察。其中,线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。今天要说的面试三问是关于线程基础
相关的:
- 线程的三种启动方式
- 线程run和start的区别
- 线程的几种状态,相互之间是如何转化的
线程的三种启动方式
1)继承thread类
class MyThread :Thread(){
override fun run() {
super.run()
}
}
fun test(){
var t1=MyThread()
t1.start()
}
2)实现runnable接口
class MyRunnable : Runnable {
override fun run() {
}
}
fun test() {
var t1 = Thread(MyRunnable(),"test")
t1.start()
}
3)实现 Callable 接口
class MyCallThread : Callable<String> {
override fun call(): String {
return "i got it"
}
}
fun test() {
var task = FutureTask(MyCallThread())
var t1 = Thread(task, "test")
t1.start()
try {
//获取结果
var result = task.get()
} catch (e: Exception) {
}
}
也有人表示其实是两个方法,因为第三个方法FutureTask
也是实现了Runnable
的方法,只不过表现方法不一样,然后带返回值。这个大家面试的时候可以都说上,然后说说自己的见解,毕竟要让面试官多多看到你的知识面。
线程run和start的区别
-
start方法,用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体中的代码执行完毕而直接继续执行后续的代码。通过调用Thread类的
start()
方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里的run()
方法 称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。 -
run方法,run方法只是类的一个普通方法而已,如果直接调用
Run
方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。
简单的说就是:调用start
方法方可启动线程,而run
方法只是thread类中的一个普通方法调用,不会启动新线程,还是在主线程里执行。
线程的几种状态,相互之间是如何转化的
1) 初始状态(New)。新创建了一个线程对象就进入了初始状态,也就是通过上述新建线程的几个方法就能进入该状态。
2) 可运行状态,就绪状态(RUNNABLE)。线程对象创建后,其他线程(比如main线程)调用了该对象的start()
方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu
的使用权。以下几种方式会进入可运行状态:
- 调用start方法。
- 拿到对象锁
- 调用yield方法
3)运行状态(RUNNING)。可运行状态(runnable)的线程获得了cpu 时间片
,执行程序代码。线程调度程序从可运行池中选择一个线程作为当前线程,就会进入运行状态。
4)阻塞状态(BLOCKED)。线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。wait,sleep,suspend
等方法都可以导致线程阻塞。
5)死亡状态(DEAD)。线程run()、main()
方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生。
- POj 1611 The Suspects
- React项目配置4(如何在开发时跨域获取api请求)
- Laravel-博客实战+踩坑laravel-blog最终的效果踩的坑
- React项目配置3(如何管理项目API接口)
- React第三方组件3(状态管理之Flux的使用④TodoList下)
- React第三方组件3(状态管理之Flux的使用③TodoList中)
- Vue实现百度下拉提示搜索一、前期准备二、代码实现三、实现效果
- React第三方组件3(状态管理之Flux的使用②TodoList上)
- ggplot2玫瑰图案例——星巴克门店分布图
- React第三方组件3(状态管理之Flux的使用①简单使用)
- 用ggplot2画了一个我也叫不上名的炫酷图表
- React技巧8(不再手动绑定this,跟.bind(this)说88)
- 美美的商务范儿——ggplot2蝴蝶图
- 机器学习(三)使用Python和R语言从头开始理解和编写神经网络介绍目录神经网络背后的直观知识多层感知器及其基础知识什么是激活函数?前向传播,反向传播和训练次数(epochs)多层感知器全批量梯度下降
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法