Threads

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.,

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

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.,

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

Nossa ficou ótimo!

Vou testar tudo agora na hora do almoço!

Muito obrigado!

1 curtida