Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.lang.*;
- import java.util.Random;
- class EstruturaThread extends Thread {///OK
- public double valor;
- public int[][] matriz;
- public int[][] matriz_nova;
- public int dim = 0;
- public int thread_id = 0;
- public int razao = 0;
- public EstruturaThread(int dim, int thread_id, int razao, int[][] matriz, int[][] matriz_nova) {///OK
- this.dim = dim;
- this.thread_id = thread_id;
- this.matriz = matriz;
- this.matriz_nova = matriz_nova;
- this.razao = razao;
- copia_borda();
- }
- public void copia_borda() {/// OK
- int i;
- for (i = 1; i < dim + 1; i++) {/// CIMA
- matriz[0][i] = matriz[dim][i];
- }
- for (i = 1; i < dim + 1; i++) {/// BAIXO
- matriz[dim + 1][i] = matriz[1][i];
- }
- for (i = 1; i < dim + 1; i++) {/// DIREITA
- matriz[i][dim + 1] = matriz[i][1];
- }
- for (i = 1; i < dim + 1; i++) {/// ESQUERDA
- matriz[i][0] = matriz[i][dim];
- }
- matriz[0][0] = matriz[dim][dim];
- matriz[0][dim + 1] = matriz[dim][1];
- matriz[dim + 1][0] = matriz[1][dim];
- matriz[dim + 1][dim + 1] = matriz[1][1];
- return;
- }
- public int conta_vivos() {/// OK
- int sum = 0;
- for (int i = 1; i < dim + 1; i++) {
- for (int j = 1; j < dim + 1; j++) {
- sum += matriz[i][j];
- }
- }
- return sum;
- }
- public void att_matriz() {///OK
- for (int i = 1; i < dim + 1; i++) {
- for (int j = 1; j < dim + 1; j++) {
- matriz[i][j] = matriz_nova[i][j];
- }
- }
- copia_borda();
- }
- public void run() {///OK
- int i, j, soma, dim_linha_ini = razao * thread_id + 1, dim_linha_fim = (razao * (thread_id + 1) + 1);
- for (i = dim_linha_ini; i < dim_linha_fim; i++) {
- for (j = 1; j < dim + 1; j++) {
- soma = matriz[i - 1][j - 1] + matriz[i][j - 1] + matriz[i + 1][j - 1] + matriz[i - 1][j] + matriz[i + 1][j] + matriz[i - 1][j + 1] + matriz[i][j + 1] + matriz[i + 1][j + 1];
- if (matriz[i][j] == 1){
- if (soma < 2){
- matriz_nova[i][j] = 0;
- }
- if (soma == 2 || soma == 3){
- matriz_nova[i][j] = 1;
- }
- if (soma > 3){
- matriz_nova[i][j] = 0;
- }
- }else{
- if (soma == 3){
- matriz_nova[i][j] = 1;
- }
- else{
- matriz_nova[i][j] = 0;
- }
- }
- }
- }
- }
- }
- public class principal {
- public static void main(String[] args) {
- int i, j, k, qtd = 4, dim = 2048, ger = 200;
- long T_ini = 0, DeltaT = 0;
- ///INSTANCIA A ESTRUTURA INTERNA DA THREAD, DPS A THREAD E POR FIM AS MATRIZES
- EstruturaThread[] TipoThread = new EstruturaThread[qtd];
- Thread[] vThread = new Thread[qtd];
- int[][] matriz = new int[dim + 2][dim + 2];
- int[][] matriz_nova = new int[dim + 2][dim + 2];
- ///PREENCHE INICIALMENTE OS VALORES DA MATRIZ
- Random gerador = new Random(1985);
- for (i = 1; i < dim + 1; i++) {
- for (j = 1; j < dim + 1; j++) {
- matriz[i][j] = gerador.nextInt(2147483647) % 2;
- }
- }
- ///ALOCA UM VETOR DE THREADS COM A ESTRUTURA INTERNA DE THREAD ESPECIFICADA
- for (i = 0; i < qtd; i++) {
- TipoThread[i] = new EstruturaThread(dim, i, dim / qtd, matriz, matriz_nova);
- vThread[i] = new Thread(TipoThread[i]);
- }
- TipoThread[0].copia_borda(); ///ATUALIZA A BORDA DA PRIMEIRA THREAD
- System.out.println("Geracao 0: " + TipoThread[0].conta_vivos());
- T_ini = System.currentTimeMillis(); ///SALVA O TEMPO ATUAL, ANTES DAS THREADS
- for (k = 0; k < ger; k++) {
- for (i = 0; i < qtd; i++) {
- TipoThread[i] = new EstruturaThread(dim, i, dim / qtd, matriz, matriz_nova);
- vThread[i] = new Thread(TipoThread[i]);
- vThread[i].start();
- }
- try {
- for (i = 0; i < qtd; i++) {
- vThread[i].join();
- }
- } catch (InterruptedException e) {
- System.out.println("Error ocurred on thread number " + i);
- }
- TipoThread[0].att_matriz();
- }
- System.out.println("Geracao " + k + ": " + TipoThread[0].conta_vivos());
- DeltaT = System.currentTimeMillis() - T_ini;///SALVA O TEMPO ATUAL, DEPOIS DAS THREADS. E JA CALCULA A DIFERENÇA PRA SABER O TEMPO
- System.out.println("Tempo gasto com " + qtd + " threads: " + DeltaT/1000 + "," + DeltaT%1000 + " s ou " + DeltaT + " ms");
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement