gpt4 book ai didi

java - 在 Java 中杀死一个不合作的线程

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:40:55 26 4
gpt4 key购买 nike

以下片段来自 JUnit 测试用例,该测试用例测试了 Sorter 的 4 种不同实现。它调用 Sorter 具有的唯一方法即 sort()

如果它花费的时间超过 2 秒,我想终止排序过程(因为我不关心任何需要超过 2 秒的实现 sort() 说 500000 整数).

我是 Java 多线程的新手,在查看了 SO 上的所有其他线程(How to kill a java thread? 和其他一些线程)之后,我认为以下是我的问题的解决方案。 问题是,它会始终如一地工作吗,还是会出现任何问题?我不关心数组或它的内容,因为 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 而不是ThreadProcess 可以被终止。
    • 显然,在这种情况下参数传递并不容易,因为它涉及一些 IPC。

最佳答案

正如您可能从您提到的其他问题中看到的那样,如果没有 Java 线程的合作,就不可能可靠地停止 Java 线程,因为 interrupt() 只有在线程对其进行测试时才会起作用(有意或无意)。

然而,杀死一个process是可能的.如果您在单独的进程中生成每个排序算法,那么您可以强行终止它。

缺点是与进程交互比与线程交互要困难得多,因为您没有共享变量。

关于java - 在 Java 中杀死一个不合作的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12536865/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com