On Sep 9, 11:28 pm, Joshua Cranmer <Pidgeo...@verizon.net> wrote:> getsanjay.sha...@gmail.com wrote:
Here I have written a program which simulates a printing job in which
'Consumer' is a printing device or software and 'Producer' submits a
printing job. But the output I get is highly deterministic i.e. the
same everytime I don't even know if I have got it right or wrong. Some
comments / pointers / alternate designs / tips / revelations would be
greatly appreciated.
What is the output?
The output is continuous stream of:
Consumer0 Id: 0 Path: c:/0.txt Time: 2007-09-10 22:38:54.859
Consumer1 Id: 1 Path: c:/1.txt Time: 2007-09-10 22:38:54.859
Consumer2 Id: 2 Path: c:/2.txt Time: 2007-09-10 22:38:54.859
[...]
On Sep 9, 11:33 pm, Lew <l...@lewscanon.com> wrote:> getsanjay.sha...@gmail.com wrote:
class Consumer {
private static int gId;
Accessed by many threads, yet you don't synchronize those accesses. Not safe.
Do not use TAB characters in Usenet posts.
Yes, I will keep that in mind from now on.
private PrintQueue queue;
private String id;
private Consumer() {
}
You do not need this constructor. Also, it's conventional to place all
constructor definitions together.
private Runnable job = new Runnable() {
public void run() {
// start consuming the print jobs and print them
try {
for (;;) {
//System.out.println("Inside run of producer");
Use logging, not System.out.println(). And isn't this the consumer?
I was told by someone not to use Javas' inbuilt logging API and rather
use 'log4j' and since this wa s a test program, I thought SOP's would
suffice the purpose.
Thread.sleep(10);
PrintJob job = queue.getJob();
You'd better make sure the queue is synchronized!
But I thought that since the PrintQueue methods are synchronized, I
don't need to do anything else, no?
public Consumer(PrintQueue queue) throws Exception {
this.queue = queue;
this.id = "Consumer" + gId;
gId++;
Synchronize!
Thread t = new Thread(job);
t.join(); /* Does this even do anything? */
Have you read the Javadocs on Thread.join?
<http://java.sun.com/javase/6/docs/api/java/lang/Thread.html#join()>
It causes the current thread to wait for the target thread to finish. Of
course, in your case it hasn't started yet.
t.start();
I am thinking it's a bad idea to fire off threads or do any significant work
in the constructor.
I picked up this idea from the 'Java programming language' book. :(
Buy and study /Java Concurrency in Practice/ by Brian Goetz, et al.
--
Lew
Yes, I'll try to get my hands on this book since everyone on this NG
seems to be recommending it but some quick fixes for this program
would be really appreciated.
Thanks and regards,
S T S