2013年12月13日星期五

Which helped me see the thread problem, why not run it

results code in here, copy run to the Threads package, run OK, more than thank you .



Drop category :


package Threads;
public class Drop {
/ / Message sent from producer to consumer.
private String message;
/ / True if consumer should wait for producer to send message
/ / false if producer should wait for consumer
/ / to retrieve message.
private boolean empty = true;
public synchronized String take () {
/ / Wait until message is available.
while (empty) {
try {
wait ();
} catch (InterruptedException e) {
}
}
/ / Toggle status.
empty = true;
/ / Notify producer that status has changed.
notifyAll ();
return message;
}
public synchronized void put (String message) {
/ / wait until message has been retrieved.
while (! empty) {
try {
wait ();
} catch (InterruptedException e) {

}
/ / Toggle staus.
empty = false;
/ / store message.
this.message = message;
/ / Notify consumer that status has changed.
notifyAll ();
}
}
}



Producer category :

package Threads;
import java.util.Random;
public class Producer implements Runnable {
private Drop drop;


public Producer (Drop drop) {
this.drop = drop;
}
public void run () {
String importantInfo [] = {
"Mares eat oats",
"Does eat oats",
"Little lambs eat ivy",
"A kid will eat ivy too"
};
Random random = new Random ();
for (int i = 0; i drop.put (importantInfo [i]);
try {
Thread.sleep (random.nextInt (5000));

} catch (InterruptedException e) {

}
}
drop.put ("DONE");

}
}





Consumer category :



package Threads;


import java.util.Random;


public class Consumer implements Runnable {
private Drop drop;


public Consumer (Drop drop) {
this.drop = drop;
}


@ Override
public void run () {
/ / TODO Auto-generated method stub
Random random = new Random ();
for (String message = drop.take ();! message.equals ("DONE"); message = drop.take ()) {
System.out.format ("MESSAGE RECEIVED:% s% n", message);
try {
Thread.sleep (random.nextInt (5000));
} catch (InterruptedException exception) {

}
}
}


}



ProducerConsumerExample main thread class :

package Threads;


public class ProducerConsumerExample {


public static void main (String [] args) {
/ / TODO Auto-generated method stub
Drop drop = new Drop ();
(new Thread (new Producer (drop))) start ().;
(new Thread (new Consumer (drop))) start ().;
}


}
------ Solution ----------------------------------- ---------
brackets wrong

public synchronized void put (String message) {
/ / wait until message has been retrieved.
while (! empty) {
try {
wait ();
} catch (InterruptedException e) {

}
} / / *** this bracket you go below
/ / Toggle staus.
empty = false;
/ / store message.
this.message = message;
/ / Notify consumer that status has changed.
notifyAll ();

}
------ For reference only --------------------------------- ------
each time the result is not it?

------ For reference only ---------------------------------- -----
Yes, blank, in every case
------ For reference only -------------------- -------------------
this code can not see , the code is written very clean , reading too tired , just say you write a function to multi-threaded won.
------ For reference only -------------------------------------- -
	public synchronized void put(String message) {
// wait until message has been retrieved.
while (!empty) {
try {
wait();
} catch (InterruptedException e) {

}
}
// Toggle staus.
empty = false;
// store message.
this.message = message;
// Notify consumer that status has changed.
notifyAll();

}

------ For reference only ------------------------------- --------



Indeed, the analysis is still not clear , thank you , bear stickers !

没有评论:

发表评论