Multiplicar matrices usando el API de hilos en JAVA – java hilos

Pregunta:


Nunca he trabajado con hilos y esta será mi primera vez.

Cómo puedo multiplicar dos matrices usando el API de hilos en JAVA?

Hasta ahora tengo el código para crear y multiplicar las matrices:

public class main {

    public static void main(String[] args) {

        final int FILAS =4;
        final int COLUMNAS = 3;
        int [][] a = new int [FILAS][COLUMNAS];
        int [][] b = new int [FILAS][COLUMNAS];
        int [][] c = new int [FILAS][COLUMNAS];

        final int BASE = 1;
        final int RANGO = 10;

        // Llenar matrices
        for (int fila = 0; fila < FILAS; ++fila)
          for (int columna = 0; columna < COLUMNAS ; ++columna){
            a[fila][columna]=(int)(Math.random()*RANGO + BASE);
            b[fila][columna]=(int)(Math.random()*RANGO + BASE);
         }

        // Imprimir matriz 1
        System.out.println("Matriz 1:");
        for (int fila = 0; fila < FILAS ; ++fila){
          for (int columna = 0; columna < COLUMNAS ; ++columna)
           System.out.print (a[fila][columna] + " ");
           System.out.println();
        }

       System.out.println();

        // Imprimir matriz 2
       System.out.println("Matriz 2:");
        for (int fila = 0; fila < FILAS ; ++fila){
          for (int columna = 0; columna < COLUMNAS; ++columna)
           System.out.print (b[fila][columna] + " ");
           System.out.println();
        }

        // Multiplicar matrices
        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < b[0].length; j++) {
                for (int k = 0; k < a[0].length; k++) {
                    // Efectuar multiplicación
                    c[i][j] += a[i][k] * b[k][j];
                }
            }
        }

        // Dibujar matriz resultante
        System.out.println("nMatriz Resultante:");
        for (int fila=0;fila<FILAS;++fila){
              for (int columna = 0; columna < COLUMNAS ; ++columna)
                  System.out.print (c[fila][columna] + " ");
                  System.out.println();
        }
    }
}

Espero puedan ayudarme. No encuentro ningún ejemplo fácil de entender en internet.

Qué tengo que hacer para usar hilos?, cómo lo aplico?.

Preguntado por: Robert Gomez

La clase Thread

Es la clase que encapsula todo el control necesario sobre los hilos de ejecución (threads). Hay que distinguir claramente un objeto Thread de un hilo de ejecución o thread.

Hay dos modos de conseguir hilos de ejecución (threads) en Java. Una es implementando el interfaz Runnable, la otra es extender la clase Thread.

La implementación del interfaz Runnable es la forma habitual de crear hilos. Los interfaces proporcionan al programador una forma de agrupar el trabajo de infraestructura de una clase. Se utilizan para diseñar los requerimientos comunes al conjunto de clases a implementar. El interfaz define el trabajo y la clase, o clases, que implementan el interfaz para realizar ese trabajo. Los diferentes grupos de clases que implementen el interfaz tendrán que seguir las mismas reglas de funcionamiento.

run()

El método run() constituye el cuerpo de un hilo en ejecución. Este es el único método del interfaz Runnable. Es llamado por el método start() después de que el hilo apropiado del sistema se haya inicializado. Siempre que el método run() devuelva el control, el hilo actual se detendrá.

LinkedList y ArrayList son dos diferentes implementaciones de la interfaz List. LinkedList usa internamente una lista doblemente ligada, mientras que ArrayList usa un arreglo que cambia de tamaño dinámicamente.

LinkedList permite eliminar e insertar elementos en tiempo constante usando iteradores.

ArrayList ofrece acceso en tiempo constante O(1), pero si quieres añadir o remover un elemento en cualquier posición que no sea la última es necesario mover elementos. Además si el arreglo ya está lleno es necesario crear uno nuevo con mayor capacidad y copiar los elementos existentes.

Entonces el ejemplo puedes cambiar LinkedList por ArrayList

ArrayList<Thread> hilos = new ArrayList<Thread>();

Te dejo el siguiente código bien explicado y entendible realizado por chuidiang:

package javaapplication2;

import java.util.LinkedList;

/**
 *
 * @author chuidiang
 */
public class MultiplicaMatricesConHilos 
{
    /**
     * Crea dos matrices, las multiplica y saca el resultado por pantalla.
     * @param args
     */
    public static void main(String[] args) 
    {
        // Dos matrices para multiplicar 
        double [][] m1 = new double[][] {{1,2,3},{1,2,3},{1,2,3}};
        double [][] m2 = new double[][] {{1,2,3},{1,2,3},{1,2,3}};

        // Se multiplican
        double [][] resultado = new MultiplicaMatricesConHilos().multiplica(m1, m2);


        // Se saca por pantalla el resultado.
        for (int i=0;i<resultado.length; i++)
        {
            for (int j=0;j<resultado[0].length;j++)
                System.out.print(resultado[i][j]+" ");
            System.out.println(" ");
        }
    }

    /**
     * Realiza la multiplicación de las dos matrices y devuelve el resultado
     * @param m1 primer operando
     * @param m2 segundo operando
     * @return resultado de multiplicar m1xm2
     */
    public double[][] multiplica (double [][] m1, double [][] m2)
    {
        // condiciones que deben cumplirse y que se suponen ciertas
        // con los parámetros de entrada
        assert m1!=null;
        assert m2!=null;
        assert m1.length > 0;
        assert m1[0].length > 0;
        assert m2.length > 0;
        assert m2[0].length > 0;
        assert m1.length==m2[0].length;

        // Calculo de las dimensiones de la matriz resultado y
        // reserva de espacio para ella
        int filas = m1.length;
        int columnas = m2[0].length;
        double [][] resultado = new double[filas][columnas];

        // Lista con todos los hilos lanzados.
        LinkedList<Thread> hilos = new LinkedList<Thread>();

        // Para cada elemento de la matriz resultado, se lanza el hilo
        // correspondiente.
        for (int fila=0; fila<filas; fila++)
            for (int columna=0; columna<columnas; columna++)
            {
                Thread hilo = new Thread(
                        new HiloMultiplicador(m1,m2,resultado,fila,columna));
                hilos.add(hilo);
                hilo.start();
            }

        // Se espera que terminen todos los hilos
        for (Thread hilo: hilos)
            try {
                hilo.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        // se devuelve el resultado obtenido    
        return resultado;
    }

}

/**
 * Calcula uno de los elementos de la matriz resultado
 * @author chuidiang
 */
class HiloMultiplicador implements Runnable
{
    private double[][] m1;
    private double[][] m2;
    private double[][] resultado;
    private int fila;
    private int columna;

    /**
     * Guarda los parámetros que se le pasan 
     * @param m1 primer operando
     * @param m2 segundo operando
     * @param resultado matriz donde dejar el resultado
     * @param fila fila que debe calcular
     * @param columna columna que debe calcular
     */
    public HiloMultiplicador (double[][] m1, double[][]m2, double[][]resultado, int fila, int columna)
    {
        this.m1 = m1;
        this.m2 = m2;
        this.resultado = resultado;
        this.fila = fila;
        this.columna = columna;
    }

    /**
     * Calcula el elemento fila,columna de la matriz resultado
     */
    public void run()
    {
        resultado[fila][columna]=0.0;
        for (int i=0;i<m2.length;i++)
            resultado[fila][columna]+=m1[fila][i]*m2[i][columna];
    }
}

Resultado:

run:
6.0 12.0 18.0  
6.0 12.0 18.0  
6.0 12.0 18.0  
BUILD SUCCESSFUL (total time: 0 seconds)

Fuente

Related Posts:

Several c-lick language editor extensions for laravel-admin based on code-mirror
...
PHP Java bridge server tools
...
Soluble PHP Java bridge integration
...
Create Reports in PHP with JasperReports
...
YUI Compressor is an open source tool that supports the compression of both JavaScript and CSS files. The JavaScript compression removes comments and white-spaces as well as obfuscates local variables using the smallest possible variable name. CSS compression is done using a regular-expression-based…
...
Tomcat no encuentra los recursos – java angularjs http
Pregunta: Bueno tengo una aplicación con AngularJS que hace peticiones al API de gitHub como un ejemplo para aprender a usar AngularJS, pero el problema ...
Crear cuenta regresiva N segundos mientras se visualiza una Activity en Android – java android
Pregunta: Quiero implementar una cuenta regresiva de N segundos, que se inicie cuando la Activity se muestre, se pare el contador cuando el usuario decide ...
¿Es legal leer imágenes y descripciones de otro sitio web y ponerlas en mi app? – java woocommerce
Pregunta: ¿Es legal leer imágenes y descripciones de otro sitio web y ponerlas en mi programa? Supongamos que quiero hacer una aplicación como la de ebay, ...
Problema con consulta JPQL + JPA + JSF + EJB – java jsf jpa
Pregunta: @Override public Usuario iniciarSesion(Usuario us){ Usuario usuario = null; String consulta; try { ...
No encuentra el audio dentro de src – java
Pregunta: Tengo una carpeta "audios" dentro de "src", para cuando construya el proyecto pueda reproducir los audios. Intento abrir el audio pero me salta "java.lang.NullPointerException" ...
¿Como saber con Apache POI y java si una columna en excel esta oculta? – java apache-poi
Pregunta: Hola estoy importando archivos excel con extensión xls y xlsx pero mi duda es como poder detectar si la columna de una celda esta ...
Spinner y EditText – java android
Pregunta: Tengo este código para cargar un spinner con datos de una base de datos: private class Getfrutas extends AsyncTask<Void, Void, Void> { ...
¿Cómo enviar datos de una pagina JSP a un Servlet sin un form? – java jsp java-ee
Pregunta: Tengo un problema. No logro recibir un valor por GET en el Servlet, no se por qué. Aquí el código JSP: <html> ...
Ayuda con un Calendario en Linea de Codigo – java
Pregunta: Pues se supone que mi código debería imprimir en algunos meses 31 días según una de mis condiciones pero no lo hace de hecho ...
¿ Por qué se me detiene la aplicación al usar este pequeño código? – java android bottombar
Pregunta: Tengo un bottomBar donde tengo 5 opciones, la última es la del mapa de google API. Mi problema es que al hacer click en ...
Tags:,

Add a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *