如何解决如何终止 Java 中的持久线程?
FutureTask<Integer> futureTask = new FutureTask(() -> run(type)); // run is a method
Thread thread = new Thread(futureTask);
thread.start();
众所周知,用户代码中可能写了一个无限循环,所以方法run
会一直运行,线程thread
不会停止。我想在超时持续时间后终止此 thread
。我怎样才能终止它而不是使用 Thread.stop
因为它不安全?
解决方法
处理需要停止的线程的正确方法是设计线程的代码,使其对被中断做出适当的响应:
-
长时间的计算需要偶尔检查当前线程的“中断”标志。
-
InterruptedException
应妥善处理。 -
线程应用程序代码对中断的响应应该是优雅地停止它正在执行的操作1并(通常)允许线程终止。
(您也可以使用使用 volatile
共享变量而不是中断标志实现的自定义标志。但是,这不涉及中断 wait
、sleep
和类似操作,因此不能很好地替代中断。)
不安全的方法是调用已弃用的 Thread.stop()
方法。 (javadocs 解释了为什么它不安全,我们不需要在这里重复。)
(相关)Thread.stop(Throwable)
方法在 Java 11 中被移除;见:
不幸的是,这两种中断线程的方法之间没有任何区别。
如果您无法让长时间运行的线程协同工作,安全的替代方法是在单独的进程中运行它;例如使用 System.ProcessBuilder
等运行 java
命令。如果时间过长,则(外部)进程可能会被终止。缺点包括:
-
外部进程无法访问当前 JVM 的变量等。所以你需要使用不同的机制在父子进程之间传递信息。
-
启动一个新的 JVM 比启动一个新线程要昂贵得多。
1 - 例如,如果线程拥有诸如打开的文件或套接字之类的资源,它应该释放它们。如果它正在为将等待结果的某个其他线程执行操作,则它应该(以适当的方式)发出没有结果的信号。以此类推。
,从外部终止线程总是不安全的,并且非常不鼓励。您需要通知线程您希望它终止并且该线程必须自己完成。这是通过类 Thread 的方法 import pandas as pd
import numpy as np
import re
def splitdf(next_row):
base_df = pd.DataFrame(next_row.to_dict(),index=[next_row.name]).reset_index().rename(columns={'index': 'Region'})
base_df.drop('Teams',axis='columns',inplace=True)
new_df = pd.DataFrame()
for next_team in next_row.Teams.split(','):
base_df['Team'] = next_team
new_df = new_df.append(base_df)
return new_df
df = pd.DataFrame({'Population' : [1400,100,1000],'Teams' : ['Yankees,Mets,Brooklyn','Rays','Giants,Athletics'],'Ad Market' : [10400,2000,8400]},index = ['New York Area','Tampa Bay','SF Bay Area'])
new_df = pd.concat(splitdf(df.iloc[i]) for i in range(len(df)))
new_df.head()
完成的。在您的示例中,将从主代码调用 interrupt()
这将导致在您的线程中引发中断标志。在您线程的 thread.interrupt()
方法中,您应该检查该标志(请参阅类 Thread 中的方法 run
和 interrupted()
)。一旦您看到您的标志被升起,就跳出循环并完成该方法。这将停止您的线程。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。