Problema Producatorului Si A Consumatorului
Problema Producatorului Si A Consumatorului
Problema Producatorului Si A Consumatorului
class MyData {
private int Data;
public void store(int Data) {
this.Data=Data; }
public int load() {
return this.Data; } }
• class Main{
• public static void main(String argv[]) {
• MyData data = new MyData();
• new Thread(new Producer(data)).start();
• new Thread(new Consumer(data)).start(); } }
• class Producer implements Runnable {
• //Thread-ul - Producator
• MyData data;
• public Producer(MyData data) {
• this.data=data; }
•
continuare
• public void run() {
• int i;
• for (i=0;;i++) {
• data.store(i);
• System.out.println ("Producer: "+i);
• try { // "adormire" de 0 pina la 0.5 sec
• Thread.sleep ((int) (Math.random()*500));
• } catch (InterruptedException e) { } } } }
• class Consumer implements Runnable {
• MyData data;
• public Consumer(MyData data) {
• this.data=data; }
• public void run() {
• for (;;) {
• System.out.println ("Consumer: "+data.load());
• try {
• Thread.sleep ((int) (Math.random()*500));
• } catch (InterruptedException e) { } } } }
Rezultatul
• Producer: 0
• Consumer: 0
• Producer: 1
• Consumer: 1
• Consumer: 1
• Producer: 2
• Producer: 3
• Consumer: 3
• Producer: 4
• Producer: 5
• Consumer: 5
• Producer: 6
• Consumer: 6
• Producer: 7
• Consumer: 7
• Consumer: 7
• Producer: 8
• Producer: 9
• Producer: 10
• Consumer: 10
Folosirea variabeliior binare
• class MyData {
• private int Data;
• private boolean Ready;
• private boolean Taken;
• public MyData() {
• Ready=false;
• Taken=true; }
• public void store(int Data) {
• while (!Taken);
• this.Data=Data;
• Taken=false;
• Ready=true;
• }
•
continuare
• class MyData {
• private int Data;
• private boolean Ready;
• private boolean Taken;
• public MyData() {
• Ready=false;
• Taken=true; }
• public void store(int Data) {
• while (!Taken);
• synchronized (this) {
• this.Data=Data;
• Taken=false;
• Ready=true;
• }
• }
continuare
• class MyData {
• private int Data;
• private boolean Ready;
• public MyData() {
• Ready=false;
• }
• public synchronized void store(int Data) {
• while (Ready)
• try {
• wait();
• } catch (InterruptedException e) { }
• this.Data=Data;
• Ready=true;
• notify();
• }
continuare
• import java.util.*;
• class Barrier { // Clasa Barrier sincronizeaza toti
• //participantii private
• int ParticipatingThreads;
• private int WaitingAtBarrier;
• public Barrier(int num){ //Constructorul
obiectului
• ParticipatingThreads = num;
• WaitingAtBarrier=0;
• }
continuare