Problema com interrupção de threads

5 respostas
threadsjava
Medieval_Historia

Boa noite a todos

Estou fritando com um exercício a algum dia e agradeceria qualquer ajuda que puderem me dar.

Exercício: fazer uma buscar um elemento em uma LinkedLista com várias threads. O usuário do programa é quem escolhe o número de threads. Quando uma das threads achar o elemento buscado, as demais são interrompitadas.

Meu problema: a busca está funcionando corretamente, mas as threads não estão sendo interrompidas

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!");
}

}

5 Respostas

rodevops

Já tentou usando equals?

if (!thread.equals(Thread.currentThread())) {
    thread.interrupt();
}
Medieval_Historia

Mesmo com equals o problema persiste

Anderson7

Já tentou separar o for que inicia as threads em dois? Um para as inicializações e um para os joins?

Medieval_Historia

Deu no mesmo

B

https://www.tutorialspoint.com/java/java_multithreading.htm

quem sabe te ajuda

Criado 7 de setembro de 2017
Ultima resposta 8 de set. de 2017
Respostas 5
Participantes 4