次の部分は、の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が含まれるため、パラメーターの受け渡しは簡単ではありません。