Bu yazımda multithreading'e değinmeye çalışacağım.Bildiğiniz gibi multithreading i destekleyen diller aynı anda birden fazla taskı çalıştırabiliyorlar ya da aynı taskı birden fazla thread e paylaşarak performans sağlayabiliyorlar.Basit bir Java uygulamasıyla da konuyu pekiştirmeye çalışalım..Benim uygulamam matrix çarpımı üzerine olacak.
Matrix çarpımıyla ilgili gerekli bilgiyi buradan alabilirsinizNormalde tahmin edebileceğiniz gibi sonuç matrixini iç içe for döngüleriyle elde edebilirdik.Ama bizim yapacağımız şey şöyle olacak. NxM 'lik matrixi MxK 'lik matrisle çarpmak istiyoruz.Soldaki matrixi satırlara böleceğiz ve her satırımızı sonuç matrixini oluşturmak için thread 'lere dağıtacağız.Lafı fazla uzatmadan uygulamaya geçeyim:)
public class MyThread extends Thread {
int[][] row;
int[][] coloum;
int index;
public MyThread(int[][] _row, int[][] _coloum, int _index) {
this.row = _row;
this.coloum = _coloum;
this.index = _index;
}
@Override
public void run(){
compute(this.row, this.coloum);
}
public void compute(int[][] _row, int[][] _coloum){
for (int i = 0; i < class="Apple-style-span" color="#000099">length; i++) {
TestClass.resultMatrix[index][0] += _row[0][i] * _coloum[i][0];
}
}
}
Şimdi ne yaptığımıza bir göz atalım.Ben çarpımın sağındaki matrixini Nx1'lik seçtim.Sonuç matriximiz de doğal olarak bir sütun gelecek.Thread 'lere yolladığımız satırları sonuç matrixinin aynı indexteki satırını hesaplamasını istiyoruz.Şimdi kodumuzu test edelim.
public class TestClass {
public static int[][] resultMatrix = new int[3][1];
public static void main(String[] args) {
final int[][] A = {
{1,2,3},
{3,4,1},
{5,2,3}
};
final int[][] B = {
{4},
{3},
{2}
};
MyThread t;
for (int i = 0; i <>
int[][] localRow = new int[1][3];
for (int j = 0; j <>
localRow[0][j] = A[i][j];
}
t = new MyThread(localRow, B, i);
t.start();
try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int i = 0; i < resultMatrix.length; i++) {
System.out.println(resultMatrix[i][0]);
}
}
}
Burada dikkat etmemiz gereken nokta main fonksiyonun da bir thread olduğudur.Bildiğiniz gibi join işlemi thread 'lerde schedule ve priority yönetiminde kullanılır.Burda join kullanmasaydık yarattığımız thread 'ler işlemlerini yaparken main fonksiyonu da aynı anda resultMatrix 'i ekrana basmaya çalışacaktı.Böylece ortaya yanlış bir sonuç çıkacaktı.Biz thread 'leri join 'leyerek main fonksiyonun bizim yarattığımız thread 'lerin çalışmasını beklemesini sağladık.Çalıştıralım ve sonucu görelim.
Herkese kolay gelsin :)