谢谢几位了,不捕获异常的话,发生异常的现成的确会停止。现在又有个具体一点的问题。
一个多线程共享资源的问题--打印问题,有三个线程分别产生某一数量的打印任务,另有一个线程处理打印,他们共享一个存放打印任务的队列,该队列有个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 循环产生作用,但是后面就不行了!不知道是为什么?
一个多线程共享资源的问题--打印问题,有三个线程分别产生某一数量的打印任务,另有一个线程处理打印,他们共享一个存放打印任务的队列,该队列有个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 循环产生作用,但是后面就不行了!不知道是为什么?
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 );