次の部分は、の4つの異なる実装をテストするJUnitテストケースからのものですSorter
。Sorter
これは、 vizを持つ唯一のメソッドを呼び出しますsort()
。
sort()
2秒より長くかかる場合はソートプロセスを強制終了したい( 500000と言うのに2秒より長くかかる実装は気にしないためIntegers
)。
私はJavaマルチスレッドを初めて使用し、SOで他のすべてのスレッド( Javaスレッドを強制終了する方法と他のいくつかのスレッド)を調べた後、問題の解決策として次のことを考えました。質問は、それは一貫して機能するのでしょうか、それとも何か問題があるのでしょうか?reset()
配列やその内容をリセットするので、その内容を気にしません。
私がそれを非協力的と呼ぶ理由s.sort()
は、私のコントロールが及ばないからです。
protected E[] arr;
@Test
public void testSortTArray() {
boolean allOk = true;
for (Sorter s : TestParams.getSorters()) {
System.out.println("Testing: " + s.getName() + " with " + arrayLenToTestWith + " elems of type "
+ classOfElemType.getName());
reset();
long startTime = System.nanoTime();
MyThread test = new MyThread(s, arr);
test.start();
try {
test.join(TestParams.getTimeThreshold());
} catch (InterruptedException e) {
e.printStackTrace();
}
if (test.isAlive())
test.interrupt();
if (!test.isInterrupted()) {
System.out.println("Time taken: " + ((System.nanoTime() - startTime) / (1000000)) + "ms");
if (!isSorted(arr)) {
allOk = false;
System.err.println(s.getName() + " didn't sort array.");
}
} else {
allOk = false;
System.err.println(s.getName() + " took longer than .");
}
}
assertTrue("At least one algo didn't sort the array.", allOk);
}
public class MyThread extends Thread {
private Sorter s;
private E[] arr;
public MyThread(Sorter s, E[] arr) {
this.s = s;
this.arr = arr;
}
@Override
public void run() {
s.sort(arr);
}
}
---編集:回答---
みんなからのコメントに基づく:
- いいえ。スレッドを一時停止しないため、私が行っていることは安全ではありません。
Thread.interrupt()
スレッドのrun()
実装によってチェックされない場合は役に立たない、中断された状態を設定するだけです。- この場合、次のソーターのsort()が同じ配列(古い「中断された」スレッドによってまだソートされている)で呼び出されるため、安全性が低下します。
- 1つのオプションは、の
Process
代わりに別のを作成することThread
です。AProcess
を殺すことができます。- 明らかに、この場合、IPCが含まれるため、パラメーターの受け渡しは簡単ではありません。