Advertisement
Guest User

Untitled

a guest
Aug 25th, 2019
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.39 KB | None | 0 0
  1. import java.lang.*;
  2. import java.util.Random;
  3.  
  4. class EstruturaThread extends Thread {///OK
  5.   public double valor;
  6.   public int[][] matriz;
  7.   public int[][] matriz_nova;
  8.   public int dim = 0;
  9.   public int thread_id = 0;
  10.   public int razao = 0;
  11.  
  12.   public EstruturaThread(int dim, int thread_id, int razao, int[][] matriz, int[][] matriz_nova) {///OK
  13.     this.dim = dim;
  14.     this.thread_id = thread_id;
  15.     this.matriz = matriz;
  16.     this.matriz_nova = matriz_nova;
  17.     this.razao = razao;
  18.     copia_borda();
  19.   }
  20.  
  21.   public void copia_borda() {/// OK
  22.     int i;
  23.     for (i = 1; i < dim + 1; i++) {/// CIMA
  24.       matriz[0][i] = matriz[dim][i];
  25.     }
  26.     for (i = 1; i < dim + 1; i++) {/// BAIXO
  27.       matriz[dim + 1][i] = matriz[1][i];
  28.     }
  29.     for (i = 1; i < dim + 1; i++) {/// DIREITA
  30.       matriz[i][dim + 1] = matriz[i][1];
  31.     }
  32.     for (i = 1; i < dim + 1; i++) {/// ESQUERDA
  33.       matriz[i][0] = matriz[i][dim];
  34.     }
  35.  
  36.     matriz[0][0] = matriz[dim][dim];
  37.     matriz[0][dim + 1] = matriz[dim][1];
  38.     matriz[dim + 1][0] = matriz[1][dim];
  39.     matriz[dim + 1][dim + 1] = matriz[1][1];
  40.  
  41.     return;
  42.   }
  43.  
  44.   public int conta_vivos() {/// OK
  45.     int sum = 0;
  46.     for (int i = 1; i < dim + 1; i++) {
  47.       for (int j = 1; j < dim + 1; j++) {
  48.         sum += matriz[i][j];
  49.       }
  50.     }
  51.     return sum;
  52.   }
  53.  
  54.   public void att_matriz() {///OK
  55.     for (int i = 1; i < dim + 1; i++) {
  56.       for (int j = 1; j < dim + 1; j++) {
  57.         matriz[i][j] = matriz_nova[i][j];
  58.       }
  59.     }
  60.     copia_borda();
  61.   }
  62.  
  63.   public void run() {///OK
  64.     int i, j, soma, dim_linha_ini = razao * thread_id + 1, dim_linha_fim = (razao * (thread_id + 1) + 1);
  65.     for (i = dim_linha_ini; i < dim_linha_fim; i++) {
  66.       for (j = 1; j < dim + 1; j++) {
  67.         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];
  68.        
  69.         if (matriz[i][j] == 1){
  70.           if (soma < 2){
  71.             matriz_nova[i][j] = 0;
  72.           }
  73.           if (soma == 2 || soma == 3){
  74.             matriz_nova[i][j] = 1;
  75.           }
  76.           if (soma > 3){
  77.             matriz_nova[i][j] = 0;
  78.           }
  79.         }else{
  80.           if (soma == 3){
  81.             matriz_nova[i][j] = 1;
  82.           }
  83.           else{
  84.             matriz_nova[i][j] = 0;
  85.           }
  86.         }
  87.       }
  88.     }
  89.   }
  90. }
  91.  
  92. public class principal {
  93.  
  94.   public static void main(String[] args) {
  95.     int i, j, k, qtd = 4, dim = 2048, ger = 200;
  96.     long T_ini = 0, DeltaT = 0;
  97.  
  98.     ///INSTANCIA A ESTRUTURA INTERNA DA THREAD, DPS A THREAD E POR FIM AS MATRIZES
  99.     EstruturaThread[] TipoThread = new EstruturaThread[qtd];
  100.     Thread[] vThread = new Thread[qtd];
  101.     int[][] matriz      = new int[dim + 2][dim + 2];
  102.     int[][] matriz_nova = new int[dim + 2][dim + 2];
  103.    
  104.  
  105.     ///PREENCHE INICIALMENTE OS VALORES DA MATRIZ
  106.     Random gerador = new Random(1985);
  107.     for (i = 1; i < dim + 1; i++) {
  108.       for (j = 1; j < dim + 1; j++) {
  109.         matriz[i][j] = gerador.nextInt(2147483647) % 2;
  110.       }
  111.     }
  112.    
  113.     ///ALOCA UM VETOR DE THREADS COM A ESTRUTURA INTERNA DE THREAD ESPECIFICADA
  114.     for (i = 0; i < qtd; i++) {
  115.       TipoThread[i] = new EstruturaThread(dim, i, dim / qtd, matriz, matriz_nova);
  116.       vThread[i] = new Thread(TipoThread[i]);
  117.     }
  118.    
  119.     TipoThread[0].copia_borda(); ///ATUALIZA A BORDA DA PRIMEIRA THREAD
  120.     System.out.println("Geracao 0: " + TipoThread[0].conta_vivos());
  121.     T_ini = System.currentTimeMillis(); ///SALVA O TEMPO ATUAL, ANTES DAS THREADS
  122.  
  123.     for (k = 0; k < ger; k++) {
  124.       for (i = 0; i < qtd; i++) {
  125.         TipoThread[i] = new EstruturaThread(dim, i, dim / qtd, matriz, matriz_nova);
  126.         vThread[i] = new Thread(TipoThread[i]);
  127.         vThread[i].start();
  128.       }
  129.       try {
  130.         for (i = 0; i < qtd; i++) {
  131.           vThread[i].join();
  132.  
  133.         }
  134.       } catch (InterruptedException e) {
  135.         System.out.println("Error ocurred on thread number " + i);
  136.       }
  137.       TipoThread[0].att_matriz();
  138.     }
  139.    
  140.     System.out.println("Geracao " + k + ": " + TipoThread[0].conta_vivos());
  141.     DeltaT = System.currentTimeMillis() - T_ini;///SALVA O TEMPO ATUAL, DEPOIS DAS THREADS. E JA CALCULA A DIFERENÇA PRA SABER O TEMPO
  142.     System.out.println("Tempo gasto com " + qtd + " threads: " + DeltaT/1000 + "," + DeltaT%1000 + " s ou " + DeltaT + " ms");
  143.   }
  144. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement