Tengo una clase que tiene un método que sirve más trabajo. Quiero hacer múltiples llamadas a este método, ejecutándolo simultáneamente (para tener múltiples búsquedas simultáneamente). El método al que quiero llamar utiliza los atributos locales de mi clase, por lo que no puedo simplemente crear una nueva clase con este método ya que no podrá acceder a los atributos de mi otra clase ya que tienen un espacio de memoria diferente.

Ejemplo:

class mainWork { 
    static int localInt;
    static String testString;

    public static void main(){
        new Runnable(){
            public void run(){
                doWork();
            }
        }.run();
    }

    public void doWork(){
        localInt = 1;
        testString = "Hi";
    }
}

La creación de una clase interna Runnable anónima no funciona ya que ese hilo no puede acceder a los atributos de mainWorks. Si creo una clase separada, extiendo Thread tengo el mismo problema. ¿Hay alguna manera (tal vez que no use hilos) para que pueda llamar a un método que todavía tendrá acceso a los atributos de la clase que lo llama mientras ejecuta llamadas simultáneas? Quiero llamar a doWork muchas veces a la vez para acelerar una operación. ¿Tareas quizás?

0
Adam Howard 15 may. 2017 a las 13:47

2 respuestas

La mejor respuesta

Tiene muchos problemas en su código:

  • Declaración de método principal incorrecta
  • Para llamar a un método, debe usar () -> doWork();
  • Debe usar ; al final de su estado de cuenta new Runnable() {...};
  • No puedes asignar una Cadena a una int testString = "Hi";

Su código debería verse así:

int localInt;
String testString;

public static void main(String[] args) {

    new Runnable() {
        public void run() {
            MainWork a = new MainWork(); 
            a.doWork();
        }
    };

}

public void doWork() {
    localInt = 1;
    testString = "Hi";
}

Hasta ahora, su programa se compilará, pero no hará nada, para iniciar su hilo debe usar:

Runnable r = new Runnable() {
    @Override
    public void run() {
        MainWork a = new MainWork(); 
        a.doWork();
    }
};

new Thread(r).start();

Otro punto, no use letras minúsculas en el nombre de su clase mainWork sino que debe usar MainWork

1
YCF_L 15 may. 2017 a las 11:20

Inspirado por su pregunta, hice este breve ejemplo para tratar el procesamiento paralelo sin preocuparse por los hilos, este es un "código no bloqueante" que puede ser más fácil de implementar.

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;

/**
 *JAVA 8 introduces a new concept for dealing with concurrencies  
 *CompletableFuture
 */

class MainWork {
    static int localInt;
    static String testString;

    public static void main(String args[]) throws IOException {

        CompletableFuture.supplyAsync(MainWork::doWork).thenAccept(System.out::println);
        System.in.read(); //this line is only to keep the program running
    }

    public static List<String> doWork() {
        localInt = 100;
        testString = "Hi";

        List<String> greetings = new ArrayList<String>();
        for (int x = 0; x < localInt; x++) {

            greetings.add(testString);
        }
        return greetings;
    }
}
0
Guilherme 15 may. 2017 a las 11:15