谢谢几位了,不捕获异常的话,发生异常的现成的确会停止。现在又有个具体一点的问题。
    一个多线程共享资源的问题--打印问题,有三个线程分别产生某一数量的打印任务,另有一个线程处理打印,他们共享一个存放打印任务的队列,该队列有个addBack()方法,把打印任务放入队列中,当队列满了时产生一个异常。我的问题是当一个产生打印任务的线程向队列中放入一任务时,由于队列已满,则放入失败。(该线程接着还有几个打印任务要放入)那么怎么把刚才这个任务再放入队列中?Sl275练习(labfile)mod14/exercise3的答案是:
(产生打印任务的线程)
public class Producer implements Runnable {
.........
public void run() {
    Printer   printer = Printer.getPrinter();
    PrintJob job = null;
    boolean  job_posted = false;    for ( int i = 1; i <= numberOfJobs; i++ ) {      // generate new print job
      job = new PrintJob(producerName + "#" + i, sizeOfJobs);      do {
       try {
 System.out.println("P: Adding job '" + job.getJobName()
              + "' to the queue");
  printer.addJob(job);//把任务放入队列中
  job_posted = true;
} catch (FullQueueException e) {
  System.out.println("P: Print queue is full, trying  
             again...");
}
      } while ( ! job_posted );      // sleep between jobs
      try {
Thread.sleep(delayBetweenJobs);
      } catch (InterruptedException e) {
System.out.println("P." + producerName + " was 
              interrupted.");
      }    }
.....
}
队列第一次满时,上面的do while 循环产生作用,但是后面就不行了!不知道是为什么?

解决方案 »

  1.   

    do {
           try {
     System.out.println("P: Adding job '" + job.getJobName()
                  + "' to the queue");
      printer.addJob(job);//把任务放入队列中
      job_posted = true;
    } catch (FullQueueException e) {
      System.out.println("P: Print queue is full, trying  
                 again...");
    }
          } while ( ! job_posted );
    改为:
    do {
           try {
     System.out.println("P: Adding job '" + job.getJobName()
                  + "' to the queue");
      printer.addJob(job);//把任务放入队列中
      job_posted = true;
    } catch (FullQueueException e) {
      System.out.println("P: Print queue is full, trying  
                 again...");
               continue;//继续循环可以sleep一会儿
    }
          } while ( ! job_posted );