《多线程》笔记 (修正版)

面试问题:

1、线程的生命周期

《多线程》笔记 (修正版)_第1张图片
答:在每一个线程创建和消亡之前,均会处于创建、就绪、运行、阻塞、终止状态之一。

《多线程》笔记 (修正版)_第2张图片

2、为什么启动线程不能直接使用run()方法,而必须通过start()方法?
答:线程的运行需要本机的操作系统支持。首先看看start()方法在Thread 类中的定义:

//start()方法部分定义
public synchronized void start(){
	if (threadStatus != 0)
		throw new illegalThreadStateException();// 重复调用start()会抛出此异常
	……
	start0();
	……
}
private native void start0();	// native关键字声明,表示调用本机的操作系统函数,因为多线程的实现需要底层操作系统的支持


3、Java中线程的两种实现区别

《多线程》笔记 (修正版)_第3张图片

答:Thread类也是Runnable接口的子类,但在Thread类中并没有完全实现Runnable接口中的run()方法

//Thread类的部分定义
//public class Thread extends Object implements Runnable
private Runnable target;
public Thread(Runnable target, String name){
	init(null, target, name, 0);
}
private void init(ThreadGrop g, Runnable target, String name, long stackSize){
	……
	this.target = target;
	……
}
public void run(){
	if (target != null) {
		target.run();
	}
}
 

 从定义可以发现:在Thread类中的run()方法调用的是Runnable接口中的run()方法,也就是说此方法是由Runnable子类完成的,所以如果要通过继承Thread类实现多线程,则必须覆写run()方法。

以上代码,Thread和Runnable的子类同时实现了Runnable接口,之后Runnable子类实例又放到了Thread类中,这种操作模式与之前的《代理设计模式》很类似。可参见:
代理设计模式
Runnable接口相对于继承Thread类,有以下显著优势:
(1)、适合多个相同程序代码的线程去处理同一资源的情况。
(2)、可以由于Java的单继承带来的局限。

(3)、增强了程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。
无论哪种方式,最终必须依靠Thread类才能启动多线程。

4、举例线程操作的相关方法
答:注意这些方法在Thread类中:
取得和设置线程名称 setName() /getName();
判断线程是否启动 isAlive();
线程的强制执行 join();
线程的休眠 Thread.sleep();
中断线程 interrupt();
后台线程 setDaemon(守护);
线程的优先级 setPriority();主线程main的优先级为NORM_PRORITY.
线程的礼让 yield();

5、线程优先级越高就一定会先执行吗?
答:不一定,哪个线程的先执行将由CPU的调度决定。

6、请详细说明生产者-消费者问题的实现
生产者-消费者问题

7、线程休眠的控制
答:休眠时间由sleep()中的参数设定,sleep()是静态方法,由Thread.sleep(暂停执行**毫秒)直接调用
8、Java程序每次运行至少启动几个线程?
答:Java命令执行一个类时,会启动JVM,每一个JVM在操作系统中启动了一个进程,Java本身具有垃圾收集机制。所以在运行时至少启动两个线程,一个是main线程,另外一个是垃圾收集线程。


Java程序员面试中的多线程问题
注意:
1、suspend()、resume()、stop() 方法使用了@Deprecated声明,不推荐使用-->设置标志位的方式停止一个线程的运行。
2、暂停状态的线程的产生情况:

(1)、该线程调用对象的wait()时。
(2)、该线程本身调用sleep()时。
(3)、该线程和另一个线程join()在一起时。

3、等待因素消失的原因:

答:分情况:
(1)、如果线程是由调用对象的wait()方法冻结,则该对象的notify(
通知)方法被调用时可解除等待。
(2)、线程进入休眠(sleep)状态,但此时指定的休眠时间到了。
4、join()方法要编写在try……catch块内,因为join()方法会抛出InterruptedException的异常。

5、当多个线程对象操纵同一共享资源时,要使用synchornized关键字来进行资源的同步处理
6、因为线程操作的不确定性,主线程可能会比其他线程先执行完,但此时其他线程不会受到任何影响(不会也Game over的)。

你可能感兴趣的:(java,JOIN,多线程,面试,deprecated)