台灣最大程式設計社群網站
線上人數
861
 
會員總數:245475
討論主題:189234
歡迎您免費加入會員
討論區列表 >> Java >> JAVA 計算執行緒花費時間
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
JAVA 計算執行緒花費時間
價值 : 10 QP  點閱數:1131 回應數:2

樓主

k32367mdbf
門外漢
0 1
16 0
發送站內信


請問各位神人大大,小弟想用JAVA計算執行緒的執行時間

具體內容主要是想用多執行緒處理矩陣相乘的問題,並計算從開始第一個執行緒到執行完最後一個執行緒之間經過的時間

小弟讓每個執行緒計算相乘後某個元素的值,比如一個n*m的矩陣A乘上m*p的矩陣B會等於一個n*p的矩陣C,總共會有n*p個執行緒,其中第むiめむjめ個執行緒就會計算第C的第むiめむjめ個元素的值

程式碼如下:


[code]
import java.util.*;
import java.io.*;

//矩陣抽象類別
abstract class MatrixMultiple
{
protected static int n,m,p;
public MatrixMultiple(int n1,int n2,int n3)
{
n=n1;
m=n2;
p=n3;
}
}

//Concurrency類別
class Concurrency extends MatrixMultiple implements Runnable
{
protected int row,col;
protected int[] a,b;
protected static int[][] c;
public Concurrency(int n1,int n2,int n3,int[][] a1,int[][] a2,int n4,int n5)
{
super(n1,n2,n3);
a=new int[n2];
b=new int[n2];
c=new int[n1][n3];
row=n4;
col=n5;
for(int i=0;i<n2;i++)
{
int s;
a[i]=a1[n4][i];
b[i]=a2[i][n5];
}
}
public void run()
{
for(int i=0;i<m;i++)
{
c[row][col]+=a[i]*b[i];
System.out.printf("%d %d run\n",row,col); //顯示此執行緒開始執行
}
}
}

public class timer
{
public static void main(String args[]) throws IOException
{
FileReader fr = new FileReader("input.txt"); //連結檔案
BufferedReader br = new BufferedReader(fr); //啟用Buffer
Scanner in =new Scanner(br); //連結輸入流

//讀入n,m
int n,m;
n=in.nextInt();
m=in.nextInt();

//讀入矩陣
int a[][]=new int[n][m];
int b[][]=new int[m][n];

for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
a[i][j]=in.nextInt();

for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
b[i][j]=in.nextInt();

//建立物件
Concurrency concurrency[][]= new Concurrency[n][n];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
concurrency[i][j]=new Concurrency(n,m,n,a,b,i,j);

//建立執行緒
Thread t[][]=new Thread[n][n];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
t[i][j]=new Thread(concurrency[i][j]);

//執行&算時間
long concurrencyStart,concurrencyFin;

concurrencyStart=System.currentTimeMillis();
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
t[i][j].start();
concurrencyFin=System.currentTimeMillis();

System.out.println(concurrencyStart); //顯示開始時間
System.out.println(concurrencyFin); //顯示結束時間

fr.close(); //關閉檔案串流
}
}
[/code]


而執行結果如下:



0 0 run
1 1 run
1 1 run
1464149482319 <-迴圈開始跑
1464149482319 <-迴圈跑完
1 0 run
0 1 run
1 0 run
0 0 run
0 1 run



小弟想問的是:
有沒有辦法能取得"最後一個執行緒跑完的時間點"?

別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

林頡辰
檢舉此回應
使用NetBeans時執行完畢會顯示執行總時間
本篇文章回覆於2016-09-06 22:13
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

etman
檢舉此回應
你可以在開執行緒的時候把他們存到一個 collection 裡 然後全部啟動後再跑個 loop 去 join 他們,最後把時間的 delta 算出來
long t0 = System.nanoTime();
List<Thread> threads = Lists.newArrayList();
for(int i = 0;i < 10;i ++){
Thread t = new Thread(new Worker());
t.start();
threads.add(t);
}
threads.foreach((Thread t)->t.join());
long t1 = System.nanoTime();
long delta = t1 - t0;

你也可以用比較 fancy 的 ForkJoinPool 來做
本篇文章回覆於2016-12-03 23:28
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.