私はいくつかのスレッドを開始するための簡単なプログラムを書いています。スレッドは整数配列から整数nを選択し、それを使用してnを待ち、tの時間を返して、スレッドが結果の配列に戻ってくるのを待ちます。スレッドについて学ぶ
1つのスレッドが終了した場合、次のスレッドを選択する必要があります。まだ別のスレッドに割り当てられていません。
もちろん:整数と結果が一致するように、配列内の順序を維持する必要があります。
私のコードは、わかるようにスムーズに動作します。 私は特に満足のいかないで見つけるとあまり変更することなく、これを解決するための良い方法があると期待したコードブロックの1行を使用しかし:
while(Thread.activeCount() != 1); // first evil line
を私はちょっと私のすべてのスレッドがすべての取得が完了を確認するために、このラインを乱用私の配列に結果でアクセスする前に、タスクが完了しました。 0.0、Null Pointer Exception ...などの病気の値を防ぐためにこれを行いたいと考えています(実際に使用するクラッシュでアプリケーションを作成する短いものすべて) 建設的な助けがあれば歓迎されます。スレッドのタスクの配列が非常に長くても、コードがスムーズに実行されていれば、結果が整数の順序に一致しなくなってしまうなど、わかりません。
建設的な助けに感謝します。
ファーストクラス:
public class ThreadArrayWriterTest {
int[] repitions;
int len = 0;
double[] timeConsumed;
public boolean finished() {
synchronized (repitions) {
return len <= 0;
}
}
public ThreadArrayWriterTest(int[] repitions) {
this.repitions = repitions;
this.len = repitions.length;
timeConsumed = new double[this.len];
}
public double[] returnTimes(int[] repititions, int numOfThreads, TimeConsumer timeConsumer) {
for (int i = 0; i < numOfThreads; i++) {
new Thread() {
public void run() {
while (!finished()) {
len--;
timeConsumed[len] = timeConsumer.returnTimeConsumed(repititions[len]);
}
}
}.start();
}
while (Thread.activeCount() != 1) // first evil line
;
return timeConsumed;
}
public static void main(String[] args) {
long begin = System.currentTimeMillis();
int[] repitions = { 3, 1, 3, 1, 2, 1, 3, 3, 3 };
int numberOfThreads = 10;
ThreadArrayWriterTest t = new ThreadArrayWriterTest(repitions);
double[] times = t.returnTimes(repitions, numberOfThreads, new TimeConsumer());
for (double d : times) {
System.out.println(d);
}
long end = System.currentTimeMillis();
System.out.println("Total time of execution: " + (end - begin));
}
}
セカンドクラス:
public class TimeConsumer {
double returnTimeConsumed(int repitions) {
long before = System.currentTimeMillis();
for (int i = 0; i < repitions; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
long after = System.currentTimeMillis();
double ret = after - before;
System.out.println("It takes: " + ret + "ms" + " for " + repitions + " runs through the for-loop");
return ret;
}
}