1. 接口是否可以继承接口?抽象类是否可以实现接口?抽象类是否可以继承实体类?
接口可以继承接口,抽象类可以实现接口,抽象类可以继承实体类,但是前提是实体类必须有明确的构造函数。
2. 启动一个线程是用run()还是start()?
启动一个线程调用的是start方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由jvm调度并执行,这并不意味着会立即执行,还需要线程调度,run方法可以产生必须退出的标志来停止一个线程。
进程有三种基本状态:运行态,就绪态,等待态(阻塞态):
调度算法:
1. 先来先服务(First Come First Served,FCFS )
最简单的调度算法,即可用于作业调度,也可用于进程调度。
按作业(进程)来到的先后次序进行调度。
优点:易于实现
缺点:调度程序每次选择的作业是等待时间最久的,而不管作业的运行时间的长短,此算法效率低;
有利于长作业,不利于短作业
2. 最短作业(进程)优先算法SJF:Shortest Job FirstSPF:Shortest Process First
可用于作业调度和进程调度。
估计作业(进程)的CPU运行时间,选取估计时间最短的作业(进程)投入运行。
优点:
(1)易于实现。
(2)在一般情况下这种调度算法比先来先服务调度算法的调度性能比FCFS好。
缺点:
(1)作业(进程)的执行时间是用户估计的,不一定准确,所以实现时不一定真正做到短作业优先调度。
(2)对长作业不利
若系统不断接受新作业,就有可能使长作业长时间得不到调度。出现饥饿现象
(3)缺少剥夺机制,对分时、实时系统仍不理想
3. 响应比最高者优先算法(HRRF:Highest Response Ratio First)
FCFS与SJF是片面的调度算法。FCFS只考虑作业等候时间而忽视了作业的计算时问,SJF只考虑用户估计的作业计算时间而忽视了作业等待时间。
HRRF是介乎这两者之间的折衷算法,既考虑作业等待时间,又考虑作业的运行时间,既照顾短作业又不使长作业的等待时间过长,改进了调度性能。
响应比R = 作业周转时间 / 作业处理时间=(作业处理时间+作业等待时间)/ 作业处理时间
= 1 +(作业等待时间 / 作业处理时间)
响应比最高者优先算法:
每次调度时,计算所有作业的响应比,选择响应比最高的调度。
短作业容易得到较高响应比,
长作业等待时间足够长后,也将获得足够高的响应比,饥饿现象不会发生。
计算响应比导致一定的时间开销,此算法性能介于FCFS和SJF之间。
4 优先级调度算法
为作业或进程确定优先级,选择优先级最高的作业或进程调度。
1.两种方式
非剥夺式:某一进程被调度运行后,除非由于它自身的原因不能运行,否则一直运行下去。
剥夺式:当有比正在运行的进程优先级更高的进程就绪时,系统可强行剥夺正在运行进程的CPU,提供给具有更高优先级的进程使用。
采用这种调度算法的关键是如何确定进程的优先级、一个进程的优先级确定之后是固定的,还是随着该进程运行的情况的变化而变化。
2.优先级类型
(1)静态优先级
在进程创建时确定优先级,在进程运行时保持不变。
确定优先级方法:
系统确定(内部优先级) :考虑进程运行时间、使用资源,进程类型。
用户确定(外部优先级) :考虑进程紧迫程度,计费与进程优先级有关。
(2)动态优先级
在进程创建时创立一个优先级,系统在运行的过程中,根据系统的设计目标,不断地调整进程的优先级,这种方法的优点是能比较客观地反映进程的实际情况和保证达到系统设计目标。如等待时间长优先级可改变 。
5. 时间片轮转调度算法(Round Robin,RR)
分时系统中常用时间片轮转法。
把CPU划分成若干时间片,并且按顺序分配给就绪队列中的每一个进程,进程轮流占有CPU,当时间片用完时,即使进程未执行完毕,系统也剥夺该进程的CPU,将该进程排在就绪队列末尾,等候下一轮调度。
1.时间片大小的确定
时间片大小对系统性能有很大影响。时间片太小,会导致频繁切换,增大系统开销;时间片太大,轮转一次时间加长,进程在一个时间片内完成,时间片轮转算法退化为FCFS算法,无法满足交互式用户需求。
确定时间片长度要从进程数目、切换开销、系统效率和响应时间等多方面加以考虑。
2.RR**改进**
RR由于采用固定时间片和仅有一个就绪队列,所以服务质量不够理想,进一步改进沿两个方向:
(1)将固定时间片改为可变时间片
引入可变时间片轮转调度算法
(2)将单就绪队列改为多就绪队列
引入多级反馈队列调度算法
6. 多级反馈队列调度算法
(MLFQ:Multi-level Feedback Queue)
设置多个就绪队列,并为各个队列赋予不同的优先级,第一个队列最高,第二个次之……;各个队列时间片大小也不同,在优先级越高的队列中,为每个进程分配的时间片越小。
处理器调度先从第一个就绪进程队列中选取进程,同一队列中的进程按FCFS算法进行排队。只有在未选到时,才从较低级的就绪进程队列中选取。
当新进程进入内存后,首先放在第一个队列末尾,到轮到该进程执行时,如在该时间片完成,便可撤离系统;若未完成,则将该进程转入第二个队列末尾…
该算法具有较好的性能,能满足各类应用的需要。
分时交互型短作业:通常在第一队列规定的时间片完成,可使终端型用户满意。
短批处理作业:通常在第一队列和第二队列各执行一个时间片就能完成,周转时间仍很短。
长批处理作业:它将一次在第1,2,3…n个队列中运行。
3. 构造器是否可以被override?
构造器不能被继承,所以不能重写,但是可以被重载。
4. 是否可以继承String类
String类被定义为类final型,所以不能被继承。
5. 当一个线程进入一个对象的一个synchronized方法中,其它线程是否可以进入此对象的其它方法?
可以进入其他方法,但是不可以进入同一个synchronized方法中。synchronized方法是对对象加锁的,所以如果有两个synchronized方法,是不可以在两个不同的线程中同时访问两个不同的synchronized方法。
6. try{}里有一个return语句,那么紧跟在在这个try后的finally{}里的code会不会被执行?什么时候执行,在return前还是后?
会执行的,因为finally必然会执行,哪怕前边已经执行了return语句,但是其实那时候的return只是将一个值放到_returnData(猜测)里边,如果finally里边再次进行return的话,那么会将_returnData更新,然后返回。
7. 用最有效率的方法算出2乘以8等于几?
System.out.println(2 << 3);
8. 两个对象值相同(x.equals(y) == true),但是可以有不同的hash code, 这句话对不对?
不对,两个同类对象有相同过的hash code,但是内容可能不同,但是两个对象内容相同,hash code必然相同。
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
9. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
是值传递,java编程语言中只有值传递,当一个对象实例作为一个参数传递到方法中时,参数的值就是对该对象的引用,对象的内容个可以改变,但是对象的引用是永远不会改变的。
10. switch是否可以做哟on个在byte上,是否可以作用在long上,是否能作用在String上?
switch支持的类型:char, byte, short, int, Character, Byte, Short, Integer, String, enum。
String类型是在jdk7后支持的