以下部分来自一个 JUnit 测试用例,它测试了Sorter
. 它调用的唯一方法Sorter
有 viz sort()
。
如果排序过程花费的时间超过 2 秒,我想终止排序过程(因为我不关心任何花费超过 2 秒才能sort()
说 500000的实现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() 将在同一个数组上调用(仍然由旧的“中断”线程排序),从而使事情变得不安全。
- 一种选择是创建一个单独
Process
的而不是Thread
. AProcess
可以被杀死。- 显然,在这种情况下传递参数并不容易,因为它涉及一些 IPC。