Como manipular Threads? Conways Game of Life
Fala pessoal, boa tarde.
Estou precisando de uma ajuda urgente. Tenho um projeto para entregar hoje da faculdade onde preciso, após criar o jogo da vida modo sequencial, inserir até 4 threads para preencher uma tabela de speedup.
Enfim, já tenho o jogo criado (do meu jeito rs) e ele está funcionando perfeitamente. Porém não conseguindo aplicar as threads, devido ao fato de não ter um bom conhecimento.
Por se tratar de um jogo muito sequencial, não tem como eu aplicar thread de qualquer jeito. Não sei se vocês conhecem sobre o jogo, mas resumindo sobre a dúvida, o local da aplicação dela que eu estava pensando é o seguinte:
- Vou receber uma matriz quadrada de entrada, após isso preciso aplicar as regras do jogo fazendo uma contagem de vizinhos de uma célula e trocando pela célula certa.
- Nessa matriz quadrada eu estava pensando em dividir ela em 4 quadrantes, e para cada quadrante fazer a contagem e troca de células através de uma thread.
OBS: Como as 4 threads não irão ter uma sequencia, nao posso trocar de qualquer jeito, porque elas tem que fazer a troca baseada na matriz original para nao ter inconsistencia de dados.
- Após isso vou ter que juntar os quatros quadrantes finais em uma só matriz e imprimir ela em um txt de saída.
O código do jogo sequencial está logo abaixo. Como posso fazer para aplicar as threads nele? Me ajudem pf rs, to no quarto semestre de Ciencias da Computacao, então é bem provável que meu código não esteja no nível de voces, mas pelo menos está rodando rs.
Estou precisando de uma ajuda urgente. Tenho um projeto para entregar hoje da faculdade onde preciso, após criar o jogo da vida modo sequencial, inserir até 4 threads para preencher uma tabela de speedup.
Enfim, já tenho o jogo criado (do meu jeito rs) e ele está funcionando perfeitamente. Porém não conseguindo aplicar as threads, devido ao fato de não ter um bom conhecimento.
Por se tratar de um jogo muito sequencial, não tem como eu aplicar thread de qualquer jeito. Não sei se vocês conhecem sobre o jogo, mas resumindo sobre a dúvida, o local da aplicação dela que eu estava pensando é o seguinte:
- Vou receber uma matriz quadrada de entrada, após isso preciso aplicar as regras do jogo fazendo uma contagem de vizinhos de uma célula e trocando pela célula certa.
- Nessa matriz quadrada eu estava pensando em dividir ela em 4 quadrantes, e para cada quadrante fazer a contagem e troca de células através de uma thread.
OBS: Como as 4 threads não irão ter uma sequencia, nao posso trocar de qualquer jeito, porque elas tem que fazer a troca baseada na matriz original para nao ter inconsistencia de dados.
- Após isso vou ter que juntar os quatros quadrantes finais em uma só matriz e imprimir ela em um txt de saída.
O código do jogo sequencial está logo abaixo. Como posso fazer para aplicar as threads nele? Me ajudem pf rs, to no quarto semestre de Ciencias da Computacao, então é bem provável que meu código não esteja no nível de voces, mas pelo menos está rodando rs.
package lifegame;
import java.io.*;
import java.util.Scanner;
public class LifeGame {
public static void main(String[] args) throws IOException {
LifeGame lg = new LifeGame();
String nomearq = lg.readFile(); //Lendo o arquivo de entrada txt
int matriz[][] = lg.read(nomearq); //Lendo a matriz de entrada
int generations = lg.generations(); //Lendo quantidade de geracoes
lg.end(matriz, generations); //Imprimindo matriz final
}
public String readFile(){
Scanner entrada = new Scanner (System.in);
String nomearq = entrada.nextLine();
return nomearq;
}
public int[][] read(String nomearq) {
int M, matriz[][] = new int[0][0];
char[] c;
try {
FileReader arq = new FileReader(nomearq);
BufferedReader lerArq = new BufferedReader(arq);
String linha = lerArq.readLine();
M = Integer.parseInt(linha);
c = new char[M];
matriz = new int[M][M];
for (int i = 0; i < M; i++) {
linha = lerArq.readLine();
for (int j = 0; j < M; j++) {
c[j] = linha.charAt(j);
String aux = "" + c[j];
matriz[i][j] = Integer.parseInt(aux);
}
}
arq.close();
} catch (IOException e) {
System.err.printf("Erro na abertura do arquivo %s\\n", e.getMessage());
}
return matriz;
}
public int countNeighbors(int matriz[][]) { //metodo para contar os vizinhos
int n = 0, min = 0;
int max = matriz.length-1;
for (int i = 1; i < 2; i++) {
for (int j = 1; j < 2; j++) {
if(i == min){}
else {
if(matriz[i-1][j] == 1) n++;
}
if(j == min){}
else {
if(matriz[i][j-1] == 1) n++;
}
if(i == min || j == max){}
else{
if(matriz[i-1][j+1] == 1) n++;
}
if(i == max || j == min){}
else{
if(matriz[i+1][j-1] == 1) n++;
}
if(i == min || j == min){}
else{
if(matriz[i-1][j-1] == 1) n++;
}
if(i == max){}
else {
if(matriz[i+1][j] == 1) n++;
}
if(j == max){}
else {
if(matriz[i][j+1] == 1) n++;
}
if(i == max || j == max){}
else{
if(matriz[i+1][j+1] == 1) n++;
}
}
}
return n;
}
public int[][] change(int matriz[][]){//metodo para retornar a matriz depois de uma geracao
LifeGame lg = new LifeGame();
int maux [][] = new int [3][3], min = 0, max = matriz.length-1, matrizaux [][] = new int [matriz.length][matriz.length];
for (int i = 0; i < matriz.length; i++) {
for (int j = 0; j < matriz.length; j++) {
for (int k = 1; k < 2; k++) {
for (int l = 1; l < 2; l++) {
for (int resetk = 0; resetk < 3; resetk++) {
for (int resetj = 0; resetj < 3; resetj++) {
maux[resetk][resetj] = 0;
}
}
maux[k][l] = matriz[i][j];
if(i == min){}
else {
maux[k-1][l] = matriz[i-1][j];
}
if(j == min){}
else {
maux[k][l-1] = matriz[i][j-1];
}
if(i == min || j == max){}
else{
maux[k-1][l+1] = matriz[i-1][j+1];
}
if(i == max || j == min){}
else{
maux[k+1][l-1] = matriz[i+1][j-1];
}
if(i == min || j == min){}
else{
maux[k-1][l-1] = matriz[i-1][j-1];
}
if(i == max){}
else {
maux[k+1][l] = matriz[i+1][j];
}
if(j == max){}
else {
maux[k][l+1] = matriz[i][j+1];
}
if(i == max || j == max){}
else{
maux[k+1][l+1] = matriz[i+1][j+1];
}
}
}
if (lg.countNeighbors(maux) < 2 || lg.countNeighbors(maux) > 3) {
matrizaux[i][j] = 0;
} else if (lg.countNeighbors(maux) == 3 && matriz[i][j] == 0){
matrizaux[i][j] = 1;
} else if (lg.countNeighbors(maux) == 2 && matriz[i][j] == 1){
matrizaux[i][j] = 1;
} else if (lg.countNeighbors(maux) == 3 && matriz[i][j] == 1){
matrizaux[i][j] = 1;
}
}
}
return matrizaux;
}
public int generations(){
Scanner entrada = new Scanner (System.in);
int x = entrada.nextInt();
return x;
}
public void end(int matriz[][], int g) throws IOException {
LifeGame lg = new LifeGame();
for (int i = 0; i < g; i++) {
matriz = lg.change(matriz);
}
FileWriter arq = new FileWriter("C:\\\\Users\\\\User\\\\Documents\\\\saida.txt");
PrintWriter saveArq = new PrintWriter(arq);
for (int i = 0; i < matriz.length; i++) {
for (int j = 0; j < matriz.length; j++) {
saveArq.printf(Integer.toString(matriz[i][j]));
}
saveArq.println();
}
arq.close();
}
}Igor Lima
Curtidas 0