3

我正在嘗試創建一個Java程序與矩陣乘法的線程。這是源代碼:矩陣乘法與線程Java

import java.util.Random; 

public class MatrixTest { 

//Creating the matrix 
static int[][] mat = new int[3][3]; 
static int[][] mat2 = new int[3][3]; 
static int[][] result = new int[3][3]; 

public static void main(String [] args){ 

    //Creating the object of random class 
    Random rand = new Random(); 


    //Filling first matrix with random values 
    for (int i = 0; i < mat.length; i++) { 
     for (int j = 0; j < mat[i].length; j++) { 
      mat[i][j]=rand.nextInt(10); 
     } 
    } 

    //Filling second matrix with random values 
    for (int i = 0; i < mat2.length; i++) { 
     for (int j = 0; j < mat2[i].length; j++) { 
      mat2[i][j]=rand.nextInt(10); 
     } 
    } 

    try{ 
     //Object of multiply Class 
     Multiply multiply = new Multiply(3,3); 

     //Threads 
     MatrixMultiplier thread1 = new MatrixMultiplier(multiply); 
     MatrixMultiplier thread2 = new MatrixMultiplier(multiply); 
     MatrixMultiplier thread3 = new MatrixMultiplier(multiply); 

     //Implementing threads 
     Thread th1 = new Thread(thread1); 
     Thread th2 = new Thread(thread2); 
     Thread th3 = new Thread(thread3); 

     //Starting threads 
     th1.start(); 
     th2.start(); 
     th3.start(); 

     th1.join(); 
     th2.join(); 
     th3.join(); 

    }catch (Exception e) { 
     e.printStackTrace(); 
    } 

    //Printing the result 
    System.out.println("\n\nResult:"); 
    for (int i = 0; i < result.length; i++) { 
     for (int j = 0; j < result[i].length; j++) { 
      System.out.print(result[i][j]+" "); 
     } 
     System.out.println(); 
    } 
    }//End main 

    }//End Class 

    //Multiply Class 
    class Multiply extends MatrixTest { 

private int i; 
private int j; 
private int chance; 

public Multiply(int i, int j){ 
    this.i=i; 
    this.j=j; 
    chance=0; 
} 

//Matrix Multiplication Function 
public synchronized void multiplyMatrix(){ 

    int sum=0; 
    int a=0; 
    for(a=0;a<i;a++){ 
     sum=0; 
     for(int b=0;b<j;b++){ 
      sum=sum+mat[chance][b]*mat2[b][a]; 
     } 
     result[chance][a]=sum; 
    } 

    if(chance>=i) 
     return; 
    chance++; 
} 
}//End multiply class 

//Thread Class 
    class MatrixMultiplier implements Runnable { 

private final Multiply mul; 

public MatrixMultiplier(Multiply mul){ 
    this.mul=mul; 
} 

@Override 
public void run() { 
    mul.multiplyMatrix(); 
} 
} 

我只是想在Eclipse和它的作品,但現在我想創建一個程序的另一個版本,在其中,我使用一個線程,我將不得不在每個單元結果矩陣。例如,我有兩個3x3矩陣。所以結果矩陣將是3x3。然後,我想使用9個線程來計算結果矩陣的9個單元格中的每一個。

任何人都可以幫助我嗎?

問候

+0

我確定有人可以幫助你!他們幫助你達成什麼目標? –

+0

我需要一些有關線程同步的幫助,因爲在那種情況下,我只使用3個線程。在另一個程序中,我想使用9個或更多的線程(當我將有大於3x3的矩陣時)爲每個單元格分配一個線程。我認爲我需要創建一個單元類,但目前我沒有其他想法 – WhatElse88

+0

那麼你是否正在尋找一種創建'n'線程的方式,其中'n'是單元的數量? –

回答

0

您可以創建n主題如下(注:numberOfThreads是要創建的線程數這將是細胞的數量):

List<Thread> threads = new ArrayList<>(numberOfThreads); 

for (int x = 0; x < numberOfThreads; x++) { 
    Thread t = new Thread(new MatrixMultiplier(multiply)); 
    t.start(); 
    threads.add(t); 
} 

for (Thread t : threads) { 
    t.join(); 
} 
0

請使用新的Executor framework創建線程,而不是手動進行管道。

ExecutorService executor = Executors.newFixedThreadPool(numberOfThreadsInPool); 
    for (int i = 0; i < numberOfThreads; i++) { 
     Runnable worker = new Thread(new MatrixMultiplier(multiply));; 
     executor.execute(worker); 
    } 
    executor.shutdown(); 
    while (!executor.isTerminated()) { 
    } 
1

有了這段代碼,我認爲我解決了我的問題。我沒有在方法中使用同步,但我認爲在這種情況下沒有必要。

import java.util.Scanner; 

class MatrixProduct extends Thread { 
     private int[][] A; 
     private int[][] B; 
     private int[][] C; 
     private int rig,col; 
     private int dim; 

     public MatrixProduct(int[][] A,int[][] B,int[][] C,int rig, int col,int dim_com) 
     { 
     this.A=A;  
     this.B=B; 
     this.C=C; 
     this.rig=rig;  
     this.col=col; 
     this.dim=dim_com;  
     } 

    public void run() 
    { 
     for(int i=0;i<dim;i++){ 
       C[rig][col]+=A[rig][i]*B[i][col];   
     }  
      System.out.println("Thread "+rig+","+col+" complete.");   
    }   
} 

public class MatrixMultiplication { 
     public static void main(String[] args) 
     {  
      Scanner In=new Scanner(System.in); 

      System.out.print("Row of Matrix A: ");  
      int rA=In.nextInt(); 
      System.out.print("Column of Matrix A: "); 
      int cA=In.nextInt(); 
      System.out.print("Row of Matrix B: ");  
      int rB=In.nextInt(); 
      System.out.print("Column of Matrix B: "); 
      int cB=In.nextInt(); 
      System.out.println(); 

      if(cA!=rB) 
      { 
       System.out.println("We can't do the matrix product!"); 
       System.exit(-1); 
      } 
     System.out.println("The matrix result from product will be "+rA+" x "+cB); 
     System.out.println(); 
     int[][] A=new int[rA][cA]; 
     int[][] B=new int[rB][cB]; 
     int[][] C=new int[rA][cB]; 
     MatrixProduct[][] thrd= new MatrixProduct[rA][cB]; 

     System.out.println("Insert A:"); 
     System.out.println(); 
     for(int i=0;i<rA;i++) 
     { 
      for(int j=0;j<cA;j++) 
      { 
       System.out.print(i+","+j+" = "); 
       A[i][j]=In.nextInt(); 
      } 
     }   
     System.out.println();  
     System.out.println("Insert B:"); 
     System.out.println(); 
      for(int i=0;i<rB;i++) 
      { 
      for(int j=0;j<cB;j++) 
      { 
      System.out.print(i+","+j+" = "); 
      B[i][j]=In.nextInt(); 
      }   
      } 
      System.out.println(); 

     for(int i=0;i<rA;i++) 
     { 
     for(int j=0;j<cB;j++) 
      { 
      thrd[i][j]=new MatrixProduct(A,B,C,i,j,cA); 
      thrd[i][j].start(); 
      } 
     } 

     for(int i=0;i<rA;i++) 
     { 
      for(int j=0;j<cB;j++) 
      { 
       try{ 
        thrd[i][j].join(); 
       } 
      catch(InterruptedException e){} 
      } 
     }   

     System.out.println(); 
     System.out.println("Result"); 
     System.out.println(); 
     for(int i=0;i<rA;i++) 
     { 
      for(int j=0;j<cB;j++) 
      { 
       System.out.print(C[i][j]+" "); 
      }  
      System.out.println();    
     }  
}  
} 
0

簡單來說,你都需要做的是,

1)創建n(否的結果基質細胞)的線程。分配他們的角色。 (例如:考慮MXN,其中M和N是矩陣,'thread1'負責將M的row_1元素與N的column_1元素相乘並存儲結果,這是合成矩陣的cell_1的值)。 )開始每個線程的過程。 (通過start()方法)

3)等到所有線程完成其進程並存儲每個單元的結果值。因爲這些過程應該在顯示結果矩陣之前完成。 (你可以通過join()方法和其他可能方式來做到這一點)

4)現在,你可以顯示結果矩陣。

注:

1)因爲在這個例子中,共享資源(M和N)僅用於只讀的目的,您不必使用「同步」的方法來訪問它們。

2)你可以看到,在這個程序中,有一組線程正在運行,並且在繼續整個程序的下一步之前,它們都需要自己完成一個特定的狀態。這種多線程編程模型被稱爲Barrier