تم النشر منذ 23 Jan 2014 السلام عليكم ورحمة الله تعالى وبركاته أنا أحاول كتابة برنامج لحساب ضرب مصفوفتين n*n مصفوفات C = A * B اقوم بالحساب بواسطة Threads ثلاثة ، وأنا استخدم two class ولكن هناك خطأ في نتيجة (غير صحيحة) هذا هو شفرة المصدر.: import java.util.Scanner;import java.util.concurrent.Semaphore;public class Matrice{private static int size,i,j,k;private static int matrice1[][]; // Premiere matriceprivate static int matrice2[][];// Deuxieme matriceprivate static int resultat[][];// Matrice resultatprivate static int vecteur[]; /* vecteur pour Numérotation des lignes et voir la ligne que cela fonctionne et que cela n'a pas fonctionné après*/ public static void main(String[] args) throws InterruptedException { Semaphore semaphore = new Semaphore(1);//sémaphore pour controler l'acces au vecteur java.util.Random r=new java.util.Random( ) ; //int t1=(Integer.toString(r.nextInt(25))); nbr aleatoire de 1 a 25 Scanner read =new Scanner(System.in);System.out.print("Enter the size of the matrice : "); size =read.nextInt(); // Generation des matrices matrice1 = new int; matrice2 = new int; resultat = new int; vecteur = new int; System.out.print("enter the elements of the first matrix: "); System.out.print("\n"); for(i=0;i<size;i++) { for(j=0;j<size;j++) { k=r.nextInt(25)+1; matrice1[j]=k; System.out.print(" "+matrice1[j]); if(j==size-1) System.out.print("\n"); } } for(i=0;i<size;i++){ //intialiser tous le matrice de resultat avec zéro for(j=0;j<size;j++){ resultat[j]=0;}} System.out.print("enter the elements of the second matrix: "); System.out.print("\n"); for(i=0;i<size;i++) { for(j=0;j<size;j++) { // k=read.nextInt(); k=r.nextInt(25)+1; matrice2[j]=k; System.out.print(" "+matrice2[j]); if(j==size-1) System.out.print("\n"); } } for(j=0;j<size;j++){ vecteur[j]=0;} // Creation du groupe de thread ThreadGroup threads_Group = new ThreadGroup("Multi_threads"); // Un thread pour chaque ligne new Thread(threads_Group, new Threads("thread1",matrice1, matrice2, vecteur,resultat,size,semaphore)).start(); new Thread(threads_Group, new Threads("thread2",matrice1, matrice2, vecteur,resultat,size,semaphore)).start(); new Thread(threads_Group, new Threads("thread3",matrice1, matrice2, vecteur,resultat,size,semaphore)).start(); /************************/ Thread.sleep(2000); System.out.print("\n"); for ( int i = 0;i < size; i++) { for (int j = 0; j < size; j++) { System.out.print(" "+resultat[j]); if(j==size-1) System.out.print("\n"); } } } }the second classimport java.util.concurrent.Semaphore;public class Threads implements Runnable{ private int tmp[][] ;// Matrice resultat private int m1[][] ; private int m2[][]; private int m3[]; //vecteur private int k=0,r;// Numero de la ligne de m1 a multiplier avec les colonnes de m2 int p=0; private Semaphore first; private String str; Threads(String str,int m1[][], int m2[][], int m3[], int tmp[][],int r,Semaphore s1) { this.m1 = m1; this.m2 = m2; this.m3 = m3; this.tmp = tmp; this.r = r; first = s1; this.str = str; } public void run() { try { while(m3[r-1]==0){ first.acquire(); while(m3[p]==1){ p++; } if(m3[p]==0){ k=p; m3[p]=1; // bool=0; System.out.println(p+" "+str ); } first.release(); Thread.sleep(30); for ( int i = 0;i < r; i++) { // Somme des produits, nous donne *un* element de tmp for (int j = 0; j < r; j++) { tmp[k][i] += m1[k][j] * m2[j][i]; System.out.print(" "+tmp[k][i]); } } } System.out.print("***************************"); } catch (InterruptedException e) { Thread.currentThread().interrupt(); e.printStackTrace();} }}الرجاء المساعدة وشكرا لكم جميعـــــــا Matrice.javaThreads.java 0 شارك هذا الرد رابط المشاركة شارك الرد من خلال المواقع ادناه
0 قام بالرد منذ 23 Jan 2014 (معدل) لم أجرب الكود، لكنك تستخدم thread، هل متأكد من ترتيب ضرب المصفوفة متسلسل؟ الـthread قد تعمل عشوائياً وضرب المصفوفات غير إبدالي، M1×M2 قد لايساوي M2×M1. تم تعديل 23 Jan 2014 بواسطه Mr.B 1 شارك هذا الرد رابط المشاركة شارك الرد من خلال المواقع ادناه
0 قام بالرد منذ 24 Jan 2014 نعم أخي أنا أستخدم الThreads ثلاثة منهم. أنا هنا كما ترى أقوم بضرب M1*M2 وأستخدم semaphore first وذلك لتنظيم الدخول للvecteur الذي يسمح بتحديد السطر الذي سيتم حسابه في المصفوفة وكذلك الأسطر التي تم حسابها ..بحيث إذا كان 0==[m3[p فهذا يعني أن السطر p لم يتم حسابه بعد ويعطي لthread الداخل رقم السطر k=p لكي يقوم بحسابه ونغير 1==[m3[p ليعلم threads الآخرون أن هذا السطر تم حسابه وينتقل ل p++.. أنا أظن أن المشكل في هذه المنطقة : Threads(String str,int m1[][], int m2[][], int m3[], int tmp[][],int r,Semaphore s1) { this.m1 = m1; this.m2 = m2; this.m3 = m3; this.tmp = tmp; this.r = r; first = s1; this.str = str; } public void run() { try { while(m3[r-1]==0){ first.acquire(); while(m3[p]==1){ p++; } if(m3[p]==0){ k=p; m3[p]=1; // bool=0; System.out.println(p+" "+str ); } first.release(); Thread.sleep(30); for ( int i = 0;i < r; i++) { // Somme des produits, nous donne *un* element de tmp for (int j = 0; j < r; j++) { tmp[k][i] += m1[k][j] * m2[j][i]; System.out.print(" "+tmp[k][i]); } } } System.out.print("***************************"); } catch (InterruptedException e) { Thread.currentThread().interrupt(); e.printStackTrace();} }} 0 شارك هذا الرد رابط المشاركة شارك الرد من خلال المواقع ادناه
0 قام بالرد منذ 24 Jan 2014 نعم أخي أنا أستخدم الThreads ثلاثة منهم. أنا هنا كما ترى أقوم بضرب M1*M2 وأستخدم semaphore first وذلك لتنظيم الدخول للvecteur الذي يسمح بتحديد السطر الذي سيتم حسابه في المصفوفة وكذلك الأسطر التي تم حسابها ..بحيث إذا كان 0==[m3[p فهذا يعني أن السطر p لم يتم حسابه بعد ويعطي لthread الداخل رقم السطر k=p لكي يقوم بحسابه ونغير 1==[m3[p ليعلم threads الآخرون أن هذا السطر تم حسابه وينتقل ل p++.. أنا أظن أن المشكل في هذه المنطقة : Threads(String str,int m1[][], int m2[][], int m3[], int tmp[][],int r,Semaphore s1) { this.m1 = m1; this.m2 = m2; this.m3 = m3; this.tmp = tmp; this.r = r; first = s1; this.str = str; } public void run() { try { while(m3[r-1]==0){ first.acquire(); while(m3[p]==1){ p++; } if(m3[p]==0){ k=p; m3[p]=1; // bool=0; System.out.println(p+" "+str ); } first.release(); Thread.sleep(30); for ( int i = 0;i < r; i++) { // Somme des produits, nous donne *un* element de tmp for (int j = 0; j < r; j++) { tmp[k][i] += m1[k][j] * m2[j][i]; System.out.print(" "+tmp[k][i]); } } } System.out.print("***************************"); } catch (InterruptedException e) { Thread.currentThread().interrupt(); e.printStackTrace();} }} 0 شارك هذا الرد رابط المشاركة شارك الرد من خلال المواقع ادناه
تم النشر منذ
السلام عليكم ورحمة الله تعالى وبركاته
the second class
الرجاء المساعدة وشكرا لكم جميعـــــــا
Matrice.java
Threads.java
شارك هذا الرد
رابط المشاركة
شارك الرد من خلال المواقع ادناه