الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ضرب مصفوفتين باستخدام - Threads

بدأه The expendable في 1 مايو 2011 · 5 رد · 1,140 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

هذا البرنامج لضرب مصفوفتين ولكنه يقوم بحساب كل ناتج فى المصفوفه الجديده فى ثريد مختلف

ولكن فيه مشكله ولا يطلع الناتج ارجو المساعده

public class MatrixMultibly{
	static int A[][] = {{2,3,4,5},{4,1,4,5},{3,2,4,5},{5,5,5,5}};
	static  int B[][] = {{5,7,4,5},{6,8,4,5},{4,2,4,5},{5,5,5,5}};

	static int M = A.length;
	static int K = B[0].length;
	static int C[][] = new int[M][K];

	public static myThread[] task;
class myThread extends Thread{

	int i,j,k;
	int ID;
	myThread(int index,int i,int j ){
        	ID = index;
        	this.i=i;
        	this.j=j;
        	//this.k=k;
	}


	public void run(){
		//Display info about this particular thread
             		for(int k = 0; k < A[0].length; k++){
                    	C[j]+=A[k]*B[k][j];
                	}


	}
}

  public MatrixMultibly()  {
//	int A[][] = {{2,3,4},{4,1,1}}; // 2 x 3
//	int B[][] = {{5,4},{6,8},{1,1}}; // 3 x 2
	assert (A[0].length != B.length);

	int ThreadNumber =0;
  	for(int i = 0; i < M; i++) {
  	for(int j = 0; j < K; j++){
      	C[j] = 0;//A[0]*B[0][j];
      	ThreadNumber++;
  	}
 	}
	System.out.println("Thread number" +ThreadNumber);
 	int taskid =1;
      	task = new myThread[ThreadNumber];
      	for(int i = 0; i < M; i++) {
            	for(int j = 0; j < K; j++){
             		//for(int k = 0; k < A[0].length; k++){

                        	task[taskid] = new myThread(taskid,i,j);
                        	task[taskid].start();//C[j] += A[k] * B[k][j];
                        	System.out.println("Thread " +taskid + "started");
                        	taskid++;
    	//}
  	}
 	}

	System.out.println("Multiply of both matrix : ");
	for(int i = 0; i < M; i++) {
  	for(int j = 0; j < K; j++) {
    	System.out.print(" "+C[j]);
  	}
	System.out.println();
	}

  }
  public static void main(String[] args) {

new MatrixMultibly();

// TODO code application logic here
	}
}

وشكرا

تم تعديل هذه المشاركة بواسطة The expendable في 1 مايو 2011 في 13:36

no-pain-no-gain.jpg

اذا كنت لا تعلم الى اين تذهب... فكــل الطرق تؤدى الى هناك

#2

المشكله في هذا السطر:

int taskid = 1;

و بالتالى هذا السطر

task[taskid] = new myThread(taskid, i, j);

فإن ال taskid ستصحب 16 .. و هو خارج حدود ال مصفوفه task

#3
taskid = 0;

تمام بس البرنامج كل مره بيطلع ناتج مختلف فى كل مره احيانا يكون يجيب ناتج بعض الخانات والباقى لا يحسبها

لا اعرف هل ها له علاقه بال producer consumer ام ماذا

اى اننى اريده الا يعرض الا بعد انتهاء اخر Thread

task[ThreadNumber]

وجربت هذا ولكن يطلع ارور

	if(!task[ThreadNumber].isAlive())
	{
	System.out.println("Multiply of both matrix : ");
	for(int i = 0; i < M; i++) {
  	for(int j = 0; j < K; j++) {
    	System.out.print(" "+C[j]);
  	}
	System.out.println();
	}
  	}

تم تعديل هذه المشاركة بواسطة The expendable في 1 مايو 2011 في 15:06

no-pain-no-gain.jpg

اذا كنت لا تعلم الى اين تذهب... فكــل الطرق تؤدى الى هناك

#4

يمكنك إستخدام:

private boolean isMainThreadIsTheOnlyRemanning()
{
	return Thread.activeCount() == 1;
}

// ......


while (true)
{
	if (isMainThreadIsTheOnlyRemanning())
	{
		System.out.println("Multiply of both matrix : ");
		for (int i = 0; i < M; i++) {
			for (int j = 0; j < K; j++) {
				System.out.print(" " + C[j]);
			}
			System.out.println();
		}
		break;
	}
}
1
#5

بارك الله فيك يا اخ هويدى ممتاز +1 ..

ولكن استخدام ال thread لم تحسن الوقت الذى يقضيه البرنامج فى التنفيذ بل انها تضاعفت مقارنه بالطريقه العاديه

ولقد قمت بتكبير المصفوفه جدا ولكن ظلت الطريقه العاديه افضل اذن ما فائده الثريدز ام ان فائدتها لا تظهر هنا ..

سؤال يطرح نفسه ؟؟

no-pain-no-gain.jpg

اذا كنت لا تعلم الى اين تذهب... فكــل الطرق تؤدى الى هناك

#6

أنت لم تستخدم ال Threads هنا الإستخدام الأمثل ...

يجب عليك تطبيق مفهوم ال Producer-Consumer

ما يتم إنتاجه في حالتك هذه (الذي هو ال business الذي تحت يديك ) هو هذا السطر:

 C[j]+=A[k]*B[k][j];

إذن هذا ما يتم إنتاجه ..

و ما يتم إستهلاكه هو هذا السطر:

System.out.print(" "+C[j]);

لذا .. لكى تستفيد من هذا النموذج .. يجب عليك إستخدامه بشكل جيد..

و بالتالى فإن المصفوفه C ستصبح ال Semaphore في هذه الحاله..

1

مواضيع مشابهة