暂无图片
暂无图片
暂无图片
暂无图片
暂无图片
多线程面试59题(含答案).pdf
116
10页
4次
2022-06-17
免费下载
1
1
1.多线程有什么用?
1)发挥多核CPU 的优势
随着工业的进步,现在的笔记本、台式机乃至商用的应用服务器至少也都是双核的
4
核、
8
核甚
16
核的也都少见,如果是线程的程序,么在
CPU
浪费
50%
4
CPU
就浪
75%
单核
CPU
所谓
"
线程
"
假的多线程,同一时间处理器只会处理一段逻辑,只不过线程之间切换得比较快,
看着个线
"
同时
"
运行。多
CPU
上的线程才正的线程,
你的时工线以真CPU 的优达到
分利用CPU 的目的。
2)防止阻塞
从程序运效率的角来看,单 CPU 不会发挥出多线程的优势反而会因
在单CPU 上运线程导线文的程序。但
是单核 CPU 我们还是要应用多线程,就是为了防止阻塞。试想,如果单核 CPU 使
用单线程,那么只要这个线程阻塞了,比方说远程读取某个数据吧,对端迟迟未返
回又没有设置超时时间,那么你的整个程序在数据返回回来之前就停止运行了。多
线程可以防止这个问题,多条线程同时运行,哪怕一条线程的代码执行读取数据阻
塞,也不会影响其它任务的执行。
3
)便于建模
这是另外一个没有这么明显的优点了。假设有一个大的任务
A
,单线程编程,那么
就要多,整个较麻但是这个任务 A
几个小任务,任B、任 C任务 D,分别建立程序模型,并通过多线程分别
行这几个任务,那就简单很多了。
2.线程和进程的区别是什么
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地
址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一
个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的
地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程
序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进
行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
3.Java 实现线程有哪几种方式?
1
)继承
Thread
类实现多线程
2)实现 Runnable 接口方式实现多线程
3)使用 ExecutorServiceCallableFuture 实现有返回结果的多线程
4.启动线程方 start()和 run()有什么区别
只有调用了 start()法,才会表现出多线程的特性,不同线程的 run()方法里面的
码交。如调用
run()
方法代码步执须等
线程
run()
方法里面的代全部执行完毕之后另外一个线程可以执行
run()
方法里面的代码。
5.怎么终止一个线程?如何优雅地终止线程?
stop
终止,不推荐。
6.一个线程的生命周期有哪几种状态?它们之间如何流转的?
NEW
:毫无疑问表示的是刚创建的线程,还没有开始启动。
RUNNABLE: 示线程已经触 start()式调用,线程正式启动,线程处于运行
状态。
BLOCKED线 synchronizedlock
1
2
占用临界区的情况,一旦获取到锁就进行
RUNNABLE
状态继续运行。
WAITING:表线程处无限待状,等个特事件重新,如
通过
wait()
方法进行等待的线程等待一
notify()
或者
notifyAll()
方法,通过
join()
法进行等待的线程等待目标线程运行结束而唤醒,一旦通过相关事件唤醒线程,线
程就进入了 RUNNABLE 状态继续运行。
TIMED_WAITING:表示线程进入了一个有时限的等待,如 sleep(3000),等待 3
后线程重新进行
RUNNABLE
状态继续运行。
TERMINATED:表线程行完毕后进行止状。需注意是,一旦线
start NEW 线
RUNNABLE
状态
7.线程中的 wait()和 sleep()方法有什么区别?
这个问题常问,sleep 方法和 wait 方法都可以用来放弃 CPU 一定的时间,不同点在
线sleep wait
方法会放弃这个对象的监视器
8.多线程同步有哪几种方法
Synchronized
关键字,
Lock
锁实现,分布式锁等。
9.什么是死锁?如何避免死锁?
死锁就是两个线程相互等待对方释放对象锁。
10.多线程之间如何进行通信
wait/notify
11、线程怎样拿到返回结果
实现
Callable
接口。
12、violatile 关键字的作用?
一个重要题,个学多线 Java 必须的。
volatile
关键字的作用的前提是要理解
Java
内存模型,这里就不讲
Java
内存模型
了,可以参见第
31
点,
volatile
关键字的作用主要有两个:
1)多线程主要围绕可见性和原子性两个特性而展开,使用 volatile 关键字修饰的变
量,保证了其多线程之间的见性,即每次取到
volatile
变量,一定是新的
数据
2)代码底层执行不像我们看到的高级语言----Java 程序这么简单,它的执行是 Java
代码-->-->据字执行 C/C++-->C/C++代码译成
-->
和硬件电路交互,现实中,为了获取更好的性能
JVM
可能会对指令进行重
序,多线程下能会出现一些想不到的问题使用 volatile 则会对禁止语重排
,当定程了代码执践角volatile
CAS
java.util.concurrent.atomic 包下的类,比如 AtomicInteger
13、新建 T1、T2、T3 三个线程,如何保证它们按顺序执行?
join 方法。
14、怎么控制同一时间只有 3 个线程运行?
Semaphore
15、为什么要使用线程池?
线线 new Thread(xxRunnable).start()
式来创建并运行一个线程,线程少的话这不会是问题,而真实环境可能会开启多个
of 10
免费下载
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文档的来源(墨天轮),文档链接,文档作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

关注
最新上传
暂无内容,敬请期待...
下载排行榜
Top250 周榜 月榜