gpt4 book ai didi

java - 终止线程的更复杂的方法(守护线程或 Thread.interrupt())

转载 作者:行者123 更新时间:2023-12-01 16:24:33 25 4
gpt4 key购买 nike

我编写了一个简单的程序来查找数字的阶乘。我使用 Thread 类的 join() 方法来实现更好的线程协调(并避免竞争条件)。我正在添加下面的代码。

public static void main(String[] args) throws InterruptedException {

List<Long> listOfNumbers = new ArrayList<>(Arrays.asList(100031489L, 4309L, 0L, 199L, 333L, 23L));
List<FactorialCalculations> threadList = new ArrayList<>();

for (Long number : listOfNumbers) {
threadList.add(new FactorialCalculations(number));
}


for (Thread thread : threadList) {
thread.start();
}

for (Thread thread : threadList) {
thread.join(3000);
}

// Thread.sleep(1000);
for (int i = 0; i < listOfNumbers.size(); i++) {
FactorialCalculations factorialCalculationsThread = threadList.get(i);
if (factorialCalculationsThread.isStatus()) {
System.out.println("Factorial of number " + listOfNumbers.get(i) + " : " + factorialCalculationsThread.getResult());
} else {
System.out.println("still processing for " + listOfNumbers.get(i));
}
}

}

每当我输入一个大值(100031489L)时,主线程都会打印除此之外的数字的输出,并且程序不会终止。我使用了两种方法 - 守护线程 thread.setDaemon(true)thread.interrupt() 以及 Thread.currentThread().isInterrupted() > (如果为 true 则打印结果) 终止程序。两种方法都有效,但我想知道哪种方法更适合我的场景。

提前致谢!

最佳答案

终止线程的常用方法是 Thread.interrupt() 。它可能更复杂,但会迫使您更好地理解工作流程并让您知道将执行哪些操作。

即使它在您的场景中可能并不重要,但它可能会更好的一个原因是,如果您或其他人要在稍后退出的程序中重用您的代码,并且您使用 Thread.setDaemon() ,线程在程序退出之前不会终止,或者可能比您想要的晚终止,而 Thread.interrupt()给你更多的控制权。您可能会在 this question 中找到有关守护线程以及何时或为何应避免或使用它们的更好信息。 .

我对守护线程了解不多,我并不是说它们不好,但也许你应该知道何时使用它们以及可能出现的一些相关问题,我希望另一个问题能帮助你解决这个问题。

关于java - 终止线程的更复杂的方法(守护线程或 Thread.interrupt()),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62177457/

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