- Producer a pus 0
- Consumer a scos 0
- Producer a pus 1
- Consumer a scos 1
- Producer a pus 2
- Consumer a scos 2
- Producer a pus 3
- Consumer a scos 3
- Producer a pus 4
- Consumer a scos 4
- Producer a pus 5
- Consumer a scos 5
- Consumer a scos 6
- Producer a pus 6
- Producer a pus 7
- Consumer a scos 7
- Consumer a scos 8
- Producer a pus 8
- Producer a pus 9
- Consumer a scos 9
Am scris următorul cod care crează două threaduri (unul care scrie -producer- și unul care citește -consumer-). Am încercat să fac în așa fel încât să nu se intercaleze citirile și scrierile (sper că codul este destul de clar).
Vreau ca cele două threaduri să scrie și să citească date din buffer alternativ. Am făcut acest lucru prin variabila "available". Când această variabilă este true, metoda get() poate să returneze datele - altfel threadul așteaptă până sunt puse date. Când este false, înseamnă că metoda put(int) poate să scrie date - altfel, threadul este așteaptă până sunt luate datele de către celălalt thread cu get().
- class Buffer{
- private int data = -1;
- private boolean available = false;
- public synchronized int get(){
- while(!available){
- try{
- wait();
- } catch(Exception e) { e.printStackTrace(); }
- }
- available = false;
- notifyAll();
- return data;
- }
- public synchronized void put(int data){
- while(available){
- try{
- wait();
- } catch (Exception e) { e.printStackTrace(); }
- }
- this.data= data;
- available = true;
- notifyAll();
- }
- }
- class Producer extends Thread {
- private Buffer buffer;
- public Producer(Buffer buffer){
- this.buffer = buffer;
- }
- public void run(){
- for(int i=0;i<10;i++){
- buffer.put(i);
- System.out.println("Producer a pus "+ i);
- }
- }
- }
- class Consumer extends Thread {
- private Buffer buffer;
- public Consumer(Buffer buffer){
- this.buffer = buffer;
- }
- public void run(){
- for(int i=0;i<10;i++){
- System.out.println("Consumer a scos " + buffer.get());
- }
- }
- }
- public class HelloWorld {
- public static void main(String args[]){
- Buffer b = new Buffer();
- Producer producer = new Producer(b);
- Consumer consumer = new Consumer(b);
- producer.setPriority(Thread.MAX_PRIORITY);
- consumer.setPriority(Thread.MAX_PRIORITY);
- producer.start();
- consumer.start();
- }
- }
Cu toate acestea, la mai multe rulări, apar greșeli relativ frecvent în rezultate (liniile 13-14 și 17-18):
De ce se întâmplă acest lucru?
Welcome to BitCell. Click here to register !
(e unul din locurile cele mai potrivite pentru zicale de-ale lui Murphy ... like "
)
