Buscar

Threads - Exemplo de Produtor/Consumidor

Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original

2f3287a6-9678-4a38-8364-49a9c7e1f0e5
ThreadProdutorConsumidor/bin/com/ayrongabriel/threads/InterfaceBuffer.class
ThreadProdutorConsumidor/bin/com/ayrongabriel/threads/Consumidor.class
ThreadProdutorConsumidor/bin/com/ayrongabriel/threads/Produtor.class
ThreadProdutorConsumidor/.project
 
	 ThreadProdutorConsumidor
	 
	 
	
	 
		 
			 org.eclipse.jdt.core.javabuilder
			 
			
		
	
	 
		 org.eclipse.jdt.core.javanature
	
ThreadProdutorConsumidor/src/com/ayrongabriel/threads/Produtor.java
package com.ayrongabriel.threads;
import java.util.Random;
public class Produtor implements Runnable {
	
	private InterfaceBuffer buffer;
	private Random random = new Random();
	
	public Produtor(InterfaceBuffer buffer) {
		this.buffer = buffer;
	}
	@Override
	public void run() {
		int total = 0;
		for (int i = 0; i < 5; i++) {
			try {
				Thread.sleep(random.nextInt(3000));
				total += i;
				buffer.set(i);
				System.out.println("\t"+ total);
				System.out.println("---------------------------");
			} catch (InterruptedException e) {}
		}
	}
}
ThreadProdutorConsumidor/src/com/ayrongabriel/threads/BufferSincronizado.java
package com.ayrongabriel.threads;
public class BufferSincronizado implements InterfaceBuffer {
	private int valor = -1;
	private boolean ocupado = false;
	@Override
	public synchronized void set(int valor) throws InterruptedException {
		
		while (ocupado) {
			System.out.println("=================================");
			System.out.println("Buffer cheio. Produtor aguarde...");
			System.out.println("=================================");
			wait();
		}
		System.out.print("PRODUTOR["+ valor+"] "+ "produziu ");
		this.valor = valor;
		ocupado = true;
		notifyAll();
	}
	@Override
	public synchronized int get() throws InterruptedException {
		while(!ocupado){
			System.out.println("===================================");
			System.out.println("Buffer vazio. Consumidor aguarde...");
			System.out.println("===================================");
			wait();
		}
		System.out.print("consumidor[" + valor+"] "+ "CONSUMIDOR ");
		ocupado = false;
		notifyAll();
		return valor;
	}
}
ThreadProdutorConsumidor/bin/com/ayrongabriel/threads/BufferTeste.class
ThreadProdutorConsumidor/bin/com/ayrongabriel/threads/BufferSincronizado.class
ThreadProdutorConsumidor/src/com/ayrongabriel/threads/BufferTeste.java
package com.ayrongabriel.threads;
public class BufferTeste {
	public static void main(String[] args) {
		
		//Buffer b = new BufferNaoSincronizado();
		InterfaceBuffer b = new BufferSincronizado();
		
		new Thread(new Produtor(b)).start();
		new Thread(new Consumidor(b)).start();
	}
}
ThreadProdutorConsumidor/.classpath
 
	 
	 
	 
ThreadProdutorConsumidor/bin/com/ayrongabriel/threads/BufferNaoSincronizado.class
ThreadProdutorConsumidor/src/com/ayrongabriel/threads/InterfaceBuffer.java
package com.ayrongabriel.threads;
/**
 * A <code>interfaceBuffer</code> representa um elo de ligação entre objetos <i>produtores</i> e <i>consumidores</i> de informações.
 * Os produtores utilizam a interfaceBuffer para gravar as informações e compartilhar com os consumidores
 * que lêem os dados da interfaceBuffer para fazer o processamento.
 * 
 * @author Ayron Gabriel
 *
 * @version 1.0
 * 
 * @since 1.0
 * 
 * @see BufferNaoSincronizado
 * @see BufferSincronizado
 *
 */
public interface InterfaceBuffer {
	
	/**
	 * Armazena o valor informado no Buffer. Geralmente será chamado pelas classes Produtoras de dados.
	 * 
	 * @param valor
	 * @throws InterruptedException
	 */
	public void set(int valor) throws InterruptedException;
	
	/**
	 * Recupera as informações armazenadas no buffer.
	 * Esse método será chamados pelas comidoras de dados.
	 * 
	 * @return
	 * @throws InterruptedException
	 */
	public int get() throws InterruptedException; 
}
ThreadProdutorConsumidor/src/com/ayrongabriel/threads/BufferNaoSincronizado.java
package com.ayrongabriel.threads;
/**
 * Implementa a <code>interfaceBuffer</code> sem sicronismo.
 * 
 * @author Ayron Gabriel
 * 
 * 
 */
public class BufferNaoSincronizado implements InterfaceBuffer {
	
	private int valor = -1;
	@Override
	public void set(int valor) throws InterruptedException {
		System.out.print("Produziu : "+valor);
		this.valor = valor;
	}
	@Override
	public int get() throws InterruptedException {
		System.out.print("Consumiu : "+ valor + "\t");
		return valor;
	}
}
ThreadProdutorConsumidor/src/com/ayrongabriel/threads/Consumidor.java
package com.ayrongabriel.threads;
import java.util.Random;
public class Consumidor implements Runnable {
	private InterfaceBuffer buffer;
	private Random random = new Random();
	
	public Consumidor(InterfaceBuffer buffer) {
		this.buffer = buffer;
	}
	
	@Override
	public void run() {
		int total = 0;
		for (int i = 0; i < 5; i++) {
			try {
				Thread.sleep(random.nextInt(3000));
				total += buffer.get();
				System.out.println(" " + total);
				System.out.println("---------------------------");
			} catch (InterruptedException e) {}
		}
	}
}

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Outros materiais