[JAVA] Multithreading Produttore/Consumatore

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
alukard990
Prode Principiante
Messaggi: 187
Iscrizione: venerdì 14 febbraio 2014, 16:03
Desktop: Mate
Distribuzione: 20.04, 64bit

[JAVA] Multithreading Produttore/Consumatore

Messaggio da alukard990 »

Salve a tutti, ho il seguente codice che rappresenta un semplice esempio del problema del Produttore/Consumatore che mi da qualche problema

Codice: Seleziona tutto

package exSincronizzazione;

public class Mailbox {
	
	private int valore = 0;
	private boolean pieno = false;

	public Mailbox() {
		super();
	}
	
	public synchronized void produci(int valore) throws InterruptedException{
		
		if(this.pieno) wait();
		this.valore=valore;
		this.pieno=true;
		System.out.format("Produttore[%s] ha prodotto un valore \n",Thread.currentThread().getName());
		notifyAll();
		
	}
	
	public synchronized int consuma() throws InterruptedException{
		
		int val;
		if(!this.pieno) wait();
		val=this.valore;
		this.pieno=false;
		System.out.format("Consumatore[%s] ha consumato il valore: %d \n",Thread.currentThread().getName(),val);
		notifyAll();
		return val;
		
		
	}
	
	
	

}

Codice: Seleziona tutto

package exSincronizzazione;

public class Produttore extends Thread {
	
	private Mailbox m;
	private int v;
	private static int count;
	
	public static int getCount() {
		return count;
	}

	public Produttore(Mailbox m, int v) {
		super();
		this.m = m;
		this.v = v;
		count++;
	}
	
	public void run(){
		try {
			m.produci(this.v);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	

}

Codice: Seleziona tutto

package exSincronizzazione;

public class Consumatore extends Thread {
	
	private Mailbox m;
	private int numIter;
	
	public Consumatore(Mailbox m, int numIter) {
		super();
		this.m = m;
		this.numIter=numIter;
	}
	
	public void run(){
		try {
			for(int i=0;i<this.numIter;i++){
				Thread.sleep(2000);
				m.consuma();
			}
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	

}

Codice: Seleziona tutto

package exSincronizzazione;

import java.io.IOException;
import java.util.Random;
import java.util.Scanner;

public class ProvaProdCons {
	
	private static Scanner s;

	public static void main(String[] args) throws InterruptedException, IOException {
		// TODO Auto-generated method stub
		
		Mailbox m=new Mailbox();
		Random ran=new Random();
		boolean exit=false;
		s = new Scanner(System.in);
		while(!exit){
			Produttore p1=new Produttore(m,ran.nextInt(100));
			Produttore p2=new Produttore(m,ran.nextInt(100));
			Consumatore c1=new Consumatore(m,Produttore.getCount());
			p1.start();
			p2.start();
			c1.start();
			p1.join();
			p2.join();
			c1.join();
			System.out.println("Uscire dal programma? Digita true o false...");
			exit=s.nextBoolean();
		}
		System.out.println("Terminato...");
	}

}
Vorrei che il programma ricominciasse a seconda se io digito da tastiera true o false ma dopo un secondo ciclo di while il programma si blocca e non va più avanti, questo è l'output finchè il programma sembra funzionare

Codice: Seleziona tutto

Produttore[Thread-1] ha prodotto un valore 
Consumatore[Thread-2] ha consumato il valore: 14 
Produttore[Thread-0] ha prodotto un valore 
Consumatore[Thread-2] ha consumato il valore: 25 
Uscire dal programma? Digita true o false...
false
Produttore[Thread-3] ha prodotto un valore 
Consumatore[Thread-5] ha consumato il valore: 2 
Produttore[Thread-4] ha prodotto un valore 
Consumatore[Thread-5] ha consumato il valore: 74 
Se digito true invece il programma termina normalmente. Grazie a tutti in anticipo per la vostra disponibilità.
alukard990
Prode Principiante
Messaggi: 187
Iscrizione: venerdì 14 febbraio 2014, 16:03
Desktop: Mate
Distribuzione: 20.04, 64bit

Re:[RISOLTO] [JAVA] Multithreading Produttore/Consumatore

Messaggio da alukard990 »

Ok ho risolto il problema del blocco, avevo dimenticato di resettare la variabile statica che conta il numero di oggetti produttori
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: Bing [Bot] e 4 ospiti