1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Programação Concorrente, Semáforos.

Gente, a minha prova de programação java, a prova é justamente fazer este trabalho de Thread, queria a ajuda de vocês se possível...

Existe 1 página jsp que eu acesso e digito o nome da thread, o Sleep,a quantidade de vezes q ela deve ser feita e uma mensagem ( existe o campo descrição mas n é importante nessa ocasião).

Eu tentei implementar o semáforo mas as threads estão entrando em estado crítico juntos, e é justamente o que não quero q aconteça, por isso o uso dos semáforos...

meu console fica assim...

15:36:28 -- Fellipe2 : mensagem2 em região não crítica
15:36:28 -- Fellipe2 : mensagem2 processando
15:36:28 -- Fellipe : mensagem em região não crítica
15:36:28 -- Fellipe : mensagem processando
15:36:31 -- Fellipe2 : mensagem2 entrando em região crítica
15:36:31 -- Fellipe2 : mensagem2 processando
15:36:31 -- Fellipe : mensagem entrando em região crítica
15:36:31 -- Fellipe : mensagem processando
15:36:34 -- Fellipe2 : mensagem2 saindo da região crítica
15:36:34 -- Fellipe : mensagem saindo da região crítica

as Threads Fellipe e Fellipe2 estao entrando e saindo da região crítica juntas, gostaria de saber se alguém poderia me indicar aonde estou errando por favor...

package ControleThread;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.Semaphore;

public class ProcessadorThread extends Thread {
    private int idThread;
    private int contador = 0;
    private String nome;
    private Semaphore semaforo;
    private int sleep;
    private String mensagem;
    private int qtde;

    public ProcessadorThread(String nome, Semaphore semaphore, int sleep,
            String mensagem, int qtde) {
        this.nome = nome;
        this.semaforo = semaphore;
        this.sleep = sleep;
        this.mensagem = mensagem;
        this.qtde = qtde;

    }

    File arquivo = new File("C:/Users/f101091/Documents/arquivo.txt");

    private void processar() {
        try {
            FileWriter writer = new FileWriter(arquivo, true);
            PrintWriter saida = new PrintWriter(writer, true);
            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
            //saida.println(sdf.format(new Date())+ " -- " + nome + " : " + mensagem + " processando");
            System.out.println(sdf.format(new Date())+ " -- " + nome + " : " + mensagem + " processando");
            saida.close();
            writer.close();
            Thread.sleep(sleep);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void entrarRegiaoNaoCritica() {
        try {
            FileWriter writer = new FileWriter(arquivo, true);
            PrintWriter saida = new PrintWriter(writer, true);
            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
            //saida.println(sdf.format(new Date()) + " -- " + nome + " : " + mensagem + " em região não crítica");
            System.out.println(sdf.format(new Date()) + " -- " + nome + " : " + mensagem + " em região não crítica");
            saida.close();
            writer.close();
            processar();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void entrarRegiaoCritica() {
        try {
            FileWriter writer = new FileWriter(arquivo, true);
            PrintWriter saida = new PrintWriter(writer, true);
            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
            //saida.println(sdf.format(new Date())+ " -- " + nome + " : " + mensagem + " entrando em região crítica");
            System.out.println(sdf.format(new Date()) + " -- " + nome + " : " + mensagem + " entrando em região crítica");
            processar();
            //saida.println(sdf.format(new Date())+ " -- " + nome + " : " + mensagem + " saindo da região crítica");
            System.out.println(sdf.format(new Date())+ " -- " + nome + " : " + mensagem + " saindo da região crítica");
            saida.close();
            writer.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void run() {
              Semaphore semaforo = new Semaphore(1);
        while (contador < this.qtde) {
                entrarRegiaoNaoCritica();
                try{
                semaforo.acquire();
                entrarRegiaoCritica();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                semaforo.release();
            }
            contador++;
        }

    }

}

Obs: tentei seguir o exemplo desse link: http://brizeno.wordpress.com/2011/09/25/praticando-concorrencia-em-java-semaforos/

  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags java threads ou faça a sua própria pergunta.