【简答1】引起线程中断的常见原因是什么?
答案解析
有4种原因的中断:
- (1)JVM将CPU资源从当前线程切换给其他线程,使本线程让出CPU的使用权处于中断状态。
- (2)线程使用CPU资源期间,执行了sleep(int millsecond)方法,使当前线程进入休眠状态。
- (3)线程使用CPU资源期间,执行了wait()方法,使得当前线程进入等待状态。
- (4)线程使用CPU资源期间,执行某个操作进入阻塞状态,比如执行读/写操作引起阻塞。
【简答2】在多线程中,为什么要引入同步机制?
答案解析:
使用setPrority(int grade)方法Java使我们可以创建多个线程,在处理多线程问题时,我们必须注意这样一个问题:当两个或多个线程同时访问同一个变量,并且一个线程需要修改这个变量。我们应对这样的问题作出处理,否则可能发生混乱
【简答3】线程调用interrupt()的作用是什么?
正确答案:
“吵醒”休眠的线程。一个占有CPU资源的线程可以让休眠的线程调用interrupt方法“吵醒”自己,即导致休眠的线程发生InterruptedException异常,从而结束休眠,重新排队等待CPU资源
【简答4】在什么方法中wait()方法、notify()及notifyAll()方法可以被使用?
答案解析:
当一个线程使用的同步方法中用到某个变量,而此变量又需要其它线程修改后才能符合本线程的需要,那么可以在同步方法中使用wait()方法。使用wait方法可以中断方法的执行,使本线程等待,暂时让出CPU的使用权,并允许其它线程使用这个同步方法。其它线程如果在使用这个同步方法时不需要等待,那么它使用完这个同步方法的同时,应当用notifyAll(0方法通知所有的由于使用这个同步方法而处于等待的线程结束等待 。
【简答5】编程题:
编写一个Java应用程序,在主线程中再创建3个线程:“运货司机”、“装运工”和“仓库管理员”。要求线程“运货司机”占有CPU资源后立刻联合线程“装运工”,也就是让“运货司机”—直等到“装运工”完成工作才能开车,而“装运工”占有CPU资源后立刻联合线程“仓库管理员”,也就是让“装运工”—直等到“仓库管理员”打开仓库才能开始搬运货物。
//E.java
public class E{
public static void main(String args[]){
ThreadJoin a = new ThreadJoin();
Thread driver = new Thread(a);
Thread worker = new Thread(a);
Thread administrator = new Thread(a);
driver.setName("货车司机");
worker.setName("装运工");
administrator.setName("仓库管理员");
a.setThread(driver,worker,administrator);
driver.start();
}
}
//ClassRoom.java
public class ThreadJoin implements Runnable {
Thread driver,worker,administrator;
public void setThread(Thread ...t){
driver=t[0];
worker=t[1];
administrator=t[2];
}
public void run() {
if(Thread.currentThread()==driver) {
System.out.printIn(driver.getName()+"等待"+worker.getName()+"搬运货物");
try{
worker.start();
worker.join();//当前线程开始等待worker结束
} catch(InterruptedException e){
System.out.printIn(driver.getName()+"启动车辆,拉着货物离开了");
}
else if(Thread.currentThread()==worker) {
System.out.printIn(worker.getName()+"等待"+administrator.getName()+"打开仓库门");
try{
administrator.start();
administrator.join();//当前线程开始等待administrator结束
}catch(InterruptedException e){}
System.out.println(worker.getName()+"给车辆装载货物完毕");
}
else if(Thread.currentThread()==administrator) {
System.out.printIn(administrator.getName()+"开始打开货仓的门,请稍等...");
try {
Thread.sleep(2000);
}
catch(InterruptedException e){}
System.out.printIn(administrator.getName()+"打开了货仓门。");
}
}
}