Threads

4 respostas
R

Pessoal boa noite,

comecei as aulas sobre thread, porém estou um pouco confuso, e não estou conseguindo implementar uma forma de fazer um calculo de n termos (no exercicio está pedindo 1.000.000 mas estou querendo deixar dinamico para facilitar nos testes e apenas na versão final deixar a quantidade de termos solicitado), podendo definir se quero usar 1, 2, 4 ou 8 threads.

Ex. com 4 threads: array populado de 1 a 100 (1, 2, 3, 4, 5, … 100)
calculo thread 1 (1+2+3+4+5…+25 = 325)
calculo thread 2 (26+27+28+29…+50 = 950)
calculo thread 3 (51+52+53+54…75 = 1575)
calculo thread 4 (76+77+78+79…+100 = 2200)

Podem me ajudar por favor?? Tenho que entregar esse exercicio quarta!

Muito obrigado

Att.,

4 Respostas

staroski

Pegue a quantidade de termos e divida pela quantidade de Threads que você quer usar.
Assim saberá quantos termos cada uma terá de processar.

R

Oi bom dia staroski, essa ideia eu até tive, mas não consegui implementar. Alguém pode me mostrar como ficaria com o código?

Att.,

staroski
import java.io.PrintStream;
import java.util.Scanner;

public class Programa {

    public static void main(String[] args) {
        try {
            Programa programa = new Programa();
            programa.executar();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

    private final Scanner entrada = new Scanner(System.in);

    private final PrintStream saida = System.out;

    public void executar() throws Exception {
        saida.print("Quantidade de termos:  ");
        int qtdTermos = Integer.parseInt(entrada.nextLine());

        saida.print("Quantidade de threads: ");
        int qtdThreads = Integer.parseInt(entrada.nextLine());

        // criar as threads
        Thread[] threads = criarThreads(qtdThreads, qtdTermos);

        // disparar as threads
        for (Thread thread : threads) {
            thread.start();
        }

        // esperar que as threads terminem
        for (Thread thread : threads) {
            thread.join();
        }
    }

    private Thread[] criarThreads(int qtdThreads, int qtdTermos) {
        int termosPorThread = qtdTermos / qtdThreads;
        Thread[] threads = new Thread[qtdThreads];
        int numero = 1;
        for (int thread = 0; thread < qtdThreads; thread++) {
            int[] termos = new int[termosPorThread];
            for (int i = 0; i < termosPorThread; i++) {
                termos[i] = numero;
                numero++;
            }
            threads[thread] = new Thread(() -> somarTermos(termos), "Thread " + thread);
        }
        return threads;
    }

    private void somarTermos(int[] termos) {
        StringBuilder texto = new StringBuilder();
        int soma = 0;
        for (int termo : termos) {
            if (texto.length() > 0) {
                texto.append(" + ");
            }
            texto.append(termo);
            soma += termo;
            Thread.yield();
        }
        texto.append(" = ").append(soma);
        saida.println(Thread.currentThread().getName() + ": " + texto);
    }
}
R

Nossa ficou ótimo!

Vou testar tudo agora na hora do almoço!

Muito obrigado!

Criado 10 de setembro de 2019
Ultima resposta 11 de set. de 2019
Respostas 4
Participantes 2