面试复习资料(八)——线程补充

39、 与线程同步以及线程调度相关的方法
a) Wait:是一个线程处于等待状态,并且释放所持有的对象的锁
b) Sleep:使一个正在运行的线程处于睡眠状态,是一个静态方法,声明会抛出异常
c) Notify:唤醒随机一个处于等待状态的线程,与优先级无关
d) notifyAll:唤醒所有处于等待状态的线程,并让它们竞争对象的锁

40、 如何控制某个方法允许并发访问现成的大小
a) 使用Semaphore类

41、 什么是线程调度?
a) 线程调度是指系统为线程分配处理器使用权的过程,主要有两种:
i. 协同是线程调度:线程的执行时间由线程本身控制,当线程把自己的工作执行完之后,主动通知系统切换到另一条线程上。
ii. 抢占式线程调度:每个线程由系统分配执行时间,不由线程本身决定。现成的执行时间是系统可控的,不会有一直阻塞的问题(java默认为抢占式)

42、 线程类的构造方法、静态块是被那个线程调用的?
a) 是被new这个线程类所在的线程所调用的,而run方法里面的代码才是被线程自身所调用

43、 为什么使用Executor框架比使用应用创建和管理线程好?
a) Executor框架让你可以创建不同的线程池。比如单线程池、固定大小的线程池或者缓存线程池(适合很多生存期短的任务的程序的可扩展线程池)

44、 常用的线程池模式以及不同线程池的使用场景?
a) 指定工作线程数量的线程池。每提交一个任务就创建一个线程,如达到最大线程数,则将提交任务存入到池队列中
b) 创建一个可缓存的线程池,任务数量几乎没有限制
c) 创建一个单线程化的Executor,即只创建唯一的工作者线程来执行任务,如果这个线程异常结束,会有另一个取代它,保证顺序执行
d) 创建一个定长的线程池,而且支持定时的执行任务

45、 Join的作用
a) 让主线程等待子线程结束后才可以继续运行

46、 为什么Thread里面的大部分方法都是final的?
a) 线程的很多方法都是由系统调用的,不能被重写和子类覆盖

47、 什么是自旋锁?
a) 没有获得锁的线程一直循环在哪里看是否该锁的保持者已经释放了锁

48、 什么是互斥锁?
a) 互斥锁:从等待到解锁过程,线程会从sleep状态变为running状态,过程中有线程上下文的切换,抢占CPU等开销

49、 自旋锁的优缺点?
a) 优点:自旋锁不会引起调用者休眠,所以效率远高于互斥锁
b) 缺点:一直占用CPU,长时间等待导致CPU效率降低
c) 自旋锁适用于锁使用者保持锁时间短,并且竞争不激烈的情况

50、 Runnable和Callable有什么不同?
a) 两者都是接口,但Callable可以返回一个类型V,而Runnable不行
b) Callable能

51、 Executor、ExecutorService、Executors的区别?
a) ExecutorService接口继承了Executor接口
b) Executor接口定义了execute方法用来接收一个Runnable接口对象,而ExecutorService接口中的submit方法可以接受Runnable和Callable接口的对象

52、 同步方法和同步代码块的区别是什么?
a) 同步方法默认用this或者当前类class对象作为锁
b) 同步代码块可以选择以什么来加锁,相比更细粒度

53、 如何确保N个线程可以访问N个资源同时又不导致死锁?
a) 可以指定获取锁的顺序,并强制线程按顺序获取锁
b) 破坏死锁产生的条件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值