我的程序中有这种类型和搜索功能。
有一种搜索方法需要一些时间才能完成,并且应该在一个单独的线程上运行,当用户键入一个新的字母进行新的搜索时,我应该可以杀死它,但问题是我使用的是第三方trie实现,不检查中断,我读到任何地方使用Thread.stop()将对我的程序产生不良影响所以我的问题是这个代码下来有没有可以使用thread.stop()???或者,如果还有其他方法可以实现这一目标吗?
ArrayList search(key)
{
Map m = patricaTrie.prefixMap(key); // 3rd party code cant be modified
HashSet hs = new HashSet(m.size());
ArrayList al = new ArrayList();
for(Object t : collection)
{
if(!hs.contains(t))
{
al.add(t);
hs.add(t);
}
}
return al;
}
答案 0 :(得分:0)
在线程中使用信号处理来正常停止正在运行的线程。 例如:
您可以创建一个布尔字段并在run:
中进行检查 public class Task implements Runnable {
private volatile boolean isRunning = true;
public void run() {
while (isRunning) {
//do work
}
}
// public void kill() {
// isRunning = false;
// }
}
现在,当你想要停止这个正在运行的线程时,只需设置标志isRunning=false;
以传递一个信号,指示线程正常停止。
答案 1 :(得分:0)
在大多数情况下,杀死线程的唯一“安全”方法是以一种可以接收停止信号的方式对线程进行编码。例如,使用一个名为shouldQuit
的布尔变量,让Thread定期检查该变量,如果它是真的则退出。
当用户键入新字母以进行新搜索时,将此布尔值设置为true并退出run方法。
答案 2 :(得分:0)
好吧,Thread.stop不会破坏JVM,但是如果你没有正确处理你的代码(即留下垃圾数据,留下损坏的实例等......),那么代码的其他一些区域可能会引用变量你在停止的线程中使用可能会遇到问题。
例如,如果任何变量,您正在线程中使用的对象被主线程在search()之外引用,那么由于对象中存在损坏的数据,您的主线程可能会出现异常。
因此,建议您确保不要在线程中使用任何从外部停止的对象,如果必须,则可以确定该对象是否已损坏。