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

Problema com interrupt() em ArrayList de threads Java

Boa Noite

Estou há algum dias fritando com o exercício abaixo. Alguém por gentileza poderia identificar o que estou fazendo de errado.

Exercício: buscar um valor numa linkedList e retornar o índice desse valor. A busca deve ser com várias threads e o usuário seta o número de threads a ser utilizado. Quando uma encontrar as outras devem ser interrompidas.

Meu problema: nenhuma thread está sendo interrompida.

Agradeço de antemão a ajuda

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class ThreadBusca extends Thread {

    private List<Integer> listaNumeros;
    private int valorBuscado;
    private boolean encontrou;
    private int inicio;

    private List<ThreadBusca> listaThreads = new ArrayList<>();

    public ThreadBusca(List<Integer> listaNumeros, int valorBuscado, boolean encontrou, int inicio,
            ArrayList<ThreadBusca> listaThreads) {
        this.listaNumeros = listaNumeros;
        this.valorBuscado = valorBuscado;
        this.inicio = inicio;
        this.listaThreads = listaThreads;
    }

    public boolean isEncontrado() {
        return encontrou;
    }

    @Override
    public void run() {
        // Posicionamento dos ponteiros
        ListIterator<Integer> ponteiro = listaNumeros.listIterator(inicio);

        while (ponteiro.hasNext()) {
            if (this.isInterrupted()) {
                break;
            }
            if (valorBuscado == ponteiro.next()) {
                encontrou = true;
                for (Thread thread : listaThreads) {
                    if (thread != Thread.currentThread())
                        thread.interrupt();
                }
                break;
            }
        }
    }

    @Override
    public String toString() {
        return "\nVALOR BUSCADO: " + valorBuscado + "\nENCONTROU: " + encontrou + "\nNOME DA THREAD: " + getName()
                + "\nINCIOU " + "BUSCA PELO ÍNDICE: " + inicio + "\nINTERROMPIDA: " + isInterrupted();
    }

}
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;

public class Principal {

    public static void main(String[] args) {
        Scanner leia = new Scanner(System.in);

        int tamLista = 15;
        int buscado;
        boolean encontrou = false;
        int numThreads;
        List<Integer> listaNumeros = new LinkedList<>();
        ArrayList<ThreadBusca>listaThreads = new ArrayList<>();


        //Preenchimento da lista de números
        for (int i = 0; i < tamLista; i++) {
            listaNumeros.add(i);
        }

        System.out.print("Entre com o elemento buscado: ");
        buscado = leia.nextInt();

        System.out.print("Entre o numero de Threads: ");
        numThreads = leia.nextInt();

        int aux = tamLista/numThreads;

        //Preenchimento da lista de threads
        for (int i = 0; i < numThreads; i++) {

            ThreadBusca t = new ThreadBusca(listaNumeros, buscado, encontrou, i * aux, listaThreads);
            listaThreads.add(t);
        }

        //Dá start nas threads da lista e pede ao main que espere até todas as threads rodarem
        for(ThreadBusca objThread : listaThreads){
            objThread.start();
            try {
                objThread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        for(ThreadBusca objThread : listaThreads){
            System.out.println(objThread.toString());
        }

        System.out.println("Programa finalizado!");
    }

}
  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!

0 resposta

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