多线程 空值线程数_跳槽涨薪季面试题之多线程(三)
点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐]
面试题一:跳槽涨薪季面试题之java基础(一)
面试题二:跳槽涨薪季面试题之java8特性(二)--文末送书
1.什么是线程?
线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。
2.线程和进程有什么区别?
线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。
3.如何在Java中实现线程?
由于线程类本身就是调用的Runnable接口所以你可以继承java.lang.Thread 类或者直接调用Runnable接口来重写run()方法实现线程。
4.用Runnable还是Thread?
如果你知道Java不支持类的多重继承,但允许你调用多个接口。所以如果你要继承其他类,当然是调用Runnable接口好了。
5.Thread 类中的start() 和 run() 方法有什么区别?
start()方法被用来启动新创建的线程,而且start()内部调用了run()方法,这和直接调用run()方法的效果不一样。当你调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启动,start()方法才会启动新线程。
6.Java中Runnable和Callable有什么不同?
Runnable和Callable都代表那些要在不同的线程中执行的任务。Runnable从JDK1.0开始就有了,Callable是在JDK1.5增加的。它们的主要区别是Callable的 call() 方法可以返回值和抛出异常,而Runnable的run()方法没有这些功能。Callable可以返回装载有计算结果的Future对象。
7.Java中CyclicBarrier 和 CountDownLatch有什么不同?
CountDownLatch : 一个线程(或者多个), 等待另外N个线程完成某个事情之后才能执行。
CyclicBarrier : N个线程相互等待,任何一个线程完成之前,所有的线程都必须等待。
这样应该就清楚一点了,对于CountDownLatch来说,重点是那个“一个线程”,是它在等待,而另外那N的线程在把“某个事情”做完之后可以继续等待,可以终止。而对于CyclicBarrier来说重点是那N个线程,他们之间任何一个没有完成,所有的线程都必须等待。
8.Java内存模型是什么?
Java内存模型规定和指引Java程序在不同的内存架构、CPU和操作系统间有确定性地行为。它在多线程的情况下尤其重要。Java内存模型对一个线程所做的变动能被其它线程可见提供了保证,它们之间是先行发生关系。这个关系定义了一些规则让程序员在并发编程时思路更清晰。比如,先行发生关系确保了:
线程内的代码能够按先后顺序执行,这被称为程序次序规则。
对于同一个锁,一个解锁操作一定要发生在时间上后发生的另一个锁定操作之前,也叫做管程锁定规则。
前一个对volatile的写操作在后一个volatile的读操作之前,也叫volatile变量规则。
一个线程内的任何操作必需在这个线程的start()调用之后,也叫作线程启动规则。
一个线程的所有操作都会在线程终止之前,线程终止规则。
一个对象的终结操作必需在这个对象构造完成之后,也叫对象终结规则。
可传递性
9.什么是线程安全?Vector是一个线程安全类吗?
多个线程可能会同时运行同一段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。一个线程安全的计数器类的同一个实例对象在被多个线程使用的情况下也不会出现计算失误。很显然你可以将集合类分成两组,线程安全和非线程安全的。Vector 是用同步方法来实现线程安全的, 而和它相似的ArrayList不是线程安全的。
10.Java中如何停止一个线程?
当run() 或者 call() 方法执行完的时候线程会自动结束,如果要手动结束一个线程,你可以用volatile 布尔变量或设置某个变量达到一定值的时候,来退出run()方法的循环或者是取消任务来中断线程。
11.一个线程运行时发生异常会怎样?
简单的说,如果异常没有被捕获该线程将会停止执行。Thread.UncaughtExceptionHandler是用于处理未捕获异常造成线程突然中断情况的一个内嵌接口。当一个未捕获异常将造成线程中断的时候JVM会使用Thread.getUncaughtExceptionHandler()来查询线程的UncaughtExceptionHandler并将线程和异常作为参数传递给handler的uncaughtException()方法进行处理。
12.为什么wait, notify 和 notifyAll这些方法不在thread类里面?
一个很明显的原因是JAVA提供的锁是对象级的而不是线程级的,每个对象都有锁,通过线程获得。如果线程需要等待某些锁那么调用对象中的wait()方法就有意义了。如果wait()方法定义在Thread类中,线程正在等待的是哪个锁就不明显了。简单的说,由于wait,notify和notifyAll都是锁级别的操作,所以把他们定义在Object类中因为锁属于对象。
13.什么是线程池?为什么要使用它?
创建线程要花费昂贵的资源和时间,如果任务来了才创建线程那么响应时间会变长,而且一个进程能创建的线程数有限。为了避免这些问题,在程序启动的时候就创建若干线程来响应处理,它们被称为线程池,里面的线程叫工作线程。从JDK1.5开始,Java API提供了Executor框架让你可以创建不同的线程池。比如单线程池,每次处理一个任务;数目固定的线程池或者是缓存线程池(一个适合很多生存期短的任务的程序的可扩展线程池)
14.Java多线程中的死锁
死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。这是一个严重的问题,因为死锁会让你的程序挂起无法完成任务,死锁的发生必须满足以下四个条件:
互斥条件:一个资源每次只能被一个进程使用。
请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
避免死锁最简单的方法就是阻止循环等待条件,将系统中所有的资源设置标志位、排序,规定所有的进程申请资源必须以一定的顺序(升序或降序)做操作来避免死锁。
15.什么是线程调度器(Thread Scheduler)和时间分片(Time Slicing)?
线程调度器是一个操作系统服务,它负责为Runnable状态的线程分配CPU时间。一旦我们创建一个线程并启动它,它的执行便依赖于线程调度器的实现。时间分片是指将可用的CPU时间分配给可用的Runnable线程的过程。分配CPU时间可以基于线程优先级或者线程等待的时间。线程调度并不受到Java虚拟机控制,所以由应用程序来控制它是更好的选择(也就是说不要让你的程序依赖于线程的优先级)。
16.为什么wait(), notify()和notifyAll()必须在同步方法或者同步块中被调用?
当一个线程需要调用对象的wait()方法的时候,这个线程必须拥有该对象的锁,接着它就会释放这个对象锁并进入等待状态直到其他线程调用这个对象上的notify()方法。同样的,当一个线程需要调用对象的notify()方法时,它会释放这个对象的锁,以便其他在等待的线程就可以得到这个对象锁。由于所有的这些方法都需要线程持有对象的锁,这样就只能通过同步来实现,所以他们只能在同步方法或者同步块中被调用。
17.什么是线程池?如何创建一个Java线程池?
一个线程池管理了一组工作线程,同时它还包括了一个用于放置等待执行的任务的队列。
java.util.concurrent.Executors提供了一个 java.util.concurrent.Executor接口的实现用于创建线程池。线程池例子展现了如何创建和使用线程池,或者阅读ScheduledThreadPoolExecutor例子,了解如何创建一个周期任务。
18.什么是阻塞队列?如何使用阻塞队列来实现生产者-消费者模型?
java.util.concurrent.BlockingQueue的特性是:当队列是空的时,从队列中获取或删除元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。
阻塞队列不接受空值,当你尝试向队列中添加空值的时候,它会抛出NullPointerException。
阻塞队列的实现都是线程安全的,所有的查询方法都是原子的并且使用了内部锁或者其他形式的并发控制。
BlockingQueue 接口是java collections框架的一部分,它主要用于实现生产者-消费者问题。
19.线程的生命周期?
线程一共有五个状态,分别如下:
新建(new):当创建Thread类的一个实例(对象)时,此线程进入新建状态(未被启动)。
运行(running):线程获得 CPU 资源正在执行任务(#run() 方法),
死亡(dead):当线程执行完毕或被其它线程杀死,线程就进入死亡状态,这时线程不可能再进入就绪状态等待执行。
堵塞(blocked):由于某种原因导致正在运行的线程让出 CPU 并暂停自己的执行,即进入堵塞状态。直到线程进入可运行(runnable)状态,才有机会再次获得 CPU 资源,转到运行(running)状态。阻塞的情况有三种:
调用 notify() 方法,回到就绪状态。
20.创建线程有几种方式
方式一,继承 Thread 类创建线程类。
方式二,通过 Runnable 接口创建线程类。
方式三,通过 Callable 和 Future 创建线程。
觉得本文对你有帮助?请分享给更多人
关注「全栈开发者社区」加星标,提升全栈技能
本公众号会不定期给大家发福利,包括送书、学习资源等,敬请期待吧!
如果感觉推送内容不错,不妨右下角点个在看转发朋友圈或收藏,感谢支持。
好文章,我在看❤️
多线程 空值线程数_跳槽涨薪季面试题之多线程(三)相关推荐
- 线程池每次用都创建吗_跳槽涨薪季面试题之多线程(三)
点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐] 面试题一:跳槽涨薪季面试题之java基础(一) 面试题二:跳槽涨薪季面试题之java8特性(二)--文末送书 1.什么是线程? 线程是操作 ...
- java 多态判断非空_跳槽涨薪季面试题之java基础(一)
点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐] 为迎接金九银十跳槽涨薪季,小编汇总了java精编版面试题,大概从java基础.java8特性.多线程.spring.springboot. ...
- 多线程 空值线程数_【开发者成长】深入理解多线程编程
云栖号资讯:[点击查看更多行业资讯] 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 为什么要使用多线程? 防止并发编程出错最好的办法就是不写并发程序 既然多线程编程容易出错,为什么它 ...
- 「2022」跳槽涨薪必备面试题及答案——VUE篇(超详细)
总结不易,希望可以帮助到即将面试或还在学习中的web前端小伙伴,祝面试顺利,拿高薪! 1.vue优点 轻量级 速度快 简单易学 低耦合 可重用性 独立开发 文档齐全,且文档为中文文档 2.vue父组件 ...
- 2019 年美团点评高级 Android 开发寒冬跳槽涨薪经验掏心分享
2019 年美团点评高级 Android 开发寒冬跳槽涨薪经验掏心分享 目录 个人简介 笔者的简要介绍 跳槽涨薪要考虑的方面有哪些? 你是正在拿着卖白菜的钱,操着卖白粉的心吗? 你真得觉得是时候跑路了 ...
- Java程序员千千万,想要涨薪的占一半,这篇读完,跳槽涨薪有希望了!
前言: 虽然面试套路众多,但对于技术面试来说,主要还是考察一个人的技术能力和沟通能力.不同类型的面试官根据自身的理解问的问题也不尽相同,没有规律可循.有些面试官喜欢问自己擅长的问题,比如在实际编程中遇 ...
- Java程序员跳槽涨薪面试心得
面试候选人的时候,有个比较常见的问题:对于一份工作,你最关注哪些因素?回答往往是薪资待遇,公司氛围,公司发展前景,工作强度等.个人比较欣赏的答案是:个人能力的成长.想收获一个薪资好,公司发展前景好的工 ...
- 某产品经理炫耀:3年跳槽3次,月薪从8k涨到38k,跳槽涨薪最快!
互联网行业最快涨薪的办法是什么?大概就是跳槽了吧. 一位产品经理分享了自己的跳槽涨薪经历: 2018年本科毕业,8K*12: 2019年跳槽啊,15K*13: 2021年初跳槽到字节跳动,27K*18 ...
- 第一百零五期:5年前,跳槽涨薪,你笑了,5年后,跳槽降薪,你慌了!
去年,我在年度绩效面谈中与某中年技术男就 "从测试转向产品经理" 的这个话题上进行了一些探讨与分析. 作者:王晔倞 图片来自 Pexels 或许是因为分析的角度比较客观.真实,再加 ...
- 五年前,跳槽涨薪,你笑了,五年后,跳槽降薪,请接受
作者 | 王晔倞 责编 | 刘静 我曾写过一篇名为 #寒冬不可怕,你想不明白自己职业发展的终极归宿才可怕# 的文章,内容是去年在年度绩效面谈中,我与某中年技术男就 "从测试转向产品经理&qu ...
最新文章
- 提升Kaggle模型的实用小技巧!
- 分布式主键解决方案----Twitter 雪花算法的原理(Java 版)
- Filter及FilterChain的使用具体解释
- golang 数据类型之间的转换
- vue 组件之间的传值
- linux教程:通过编译安装ansible解决apt install ansible后无法安装AWX的莫名问题
- DotNet(C#)自定义运行时窗体设计器 一
- 【渝粤教育】国家开放大学2018年秋季 2405T现代汉语(1) 参考试题
- 关于数据运营的一点小思考
- 【CodeForces】700 D. Huffman Coding on Segment 哈夫曼树+莫队+分块
- 5.七个重点网络协议
- HDU 4403 A very hard Aoshu problem (DFS暴力)
- jk-fourm.php,JK车头灯与我的新年期望(已更新完毕)
- 【数据分析面试】大厂高频SQL笔试题(二)
- 计算机同步增长率公式,行测资料分析增长率的计算技巧
- 4、SYN-RCVD
- 服务器怎么改成gpt分区支持,硬盘mbr分区更改成gpt分区的方法
- zabbix通过yum安装,启动报错zabbix-agent.service never wrote its PID file. Failing.
- python制作表白神器_用Python做一个520表白神器,值得收藏
- 【重磅】百度智能运维工程架构
热门文章
- Andro - Multipurpose OpenCart 2.X 自适应主题模板 ABC-0651
- SQL Server MYSQL 检查点的好处
- 应用HTK搭建语音拨号系统2:创建单音素HMM模型
- CentOS6.5 webserver---网络配置
- 全球排名前50网站使用的开发语言及系统平台
- Dedecms文件夹目录解释完整版
- 解决问题:Exception during message handling: Unacceptable CPU info: CPU doesn't have compatibility...
- 戴尔DCS两周年庆 推新型数据中心设备
- 编写可执行程序,其它程序调用,并返回数据,C#
- UrlRewriter配置IIS支持伪静态