1、线程的生命周期
答:在每一个线程创建和消亡之前,均会处于创建、就绪、运行、阻塞、终止状态之一。
//start()方法部分定义
public synchronized void start(){
if (threadStatus != 0)
throw new illegalThreadStateException();// 重复调用start()会抛出此异常
……
start0();
……
}
private native void start0(); // native关键字声明,表示调用本机的操作系统函数,因为多线程的实现需要底层操作系统的支持
3、Java中线程的两种实现区别
答: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类中,这种操作模式与之前的《代理设计模式》很类似。可参见:(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线程,另外一个是垃圾收集线程。
(1)、该线程调用对象的wait()时。
(2)、该线程本身调用sleep()时。
(3)、该线程和另一个线程join()在一起时。
答:分情况:
(1)、如果线程是由调用对象的wait()方法冻结,则该对象的notify(通知)方法被调用时可解除等待。
(2)、线程进入休眠(sleep)状态,但此时指定的休眠时间到了。
4、join()方法要编写在try……catch块内,因为join()方法会抛出InterruptedException的异常。
5、当多个线程对象操纵同一共享资源时,要使用synchornized关键字来进行资源的同步处理
6、因为线程操作的不确定性,主线程可能会比其他线程先执行完,但此时其他线程不会受到任何影响(不会也Game over的)。