所以,我有一个非循环的线程,我想停止。我搜索了互联网,没有创建一个循环线程没有找到解决方案。 线程从Web服务器请求信息并在JList中显示结果。它不会永远循环。我之所以将此函数设置为Thread,是因为它需要大约1-5分钟,具体取决于从Web服务器发送的信息量,并且我希望继续在应用程序中工作而不会被请求阻止。线程看起来像这样:
public class Search extends Thread implements Runnable{
@Override
public void run(){
requestToWebServer(); //10-20sec
receiveInformation(); //10-20sec
handleResponse(); //1-4min
addDataToJList(); //5sec
}
}
现在我的问题是我没有看到任何方法阻止此线程完全运行。我不想使用弃用的方法Thread.stop。
修改 运行方法中的完整代码:
public void run(){
try{
log.info(Languages.getString("SearchFrame.2") + this.query); //$NON-NLS-1$
String resp = ConnectionUtils.request("http://hdfilme.tv/movie/search?key=" //$NON-NLS-1$
+ this.query.replaceAll(" ", "+")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
Matcher movie_img_matcher = MOVIE_IMG_PATTERN.matcher(resp);
Matcher movie_stream_matcher = MOVIE_STREAM_PATTERN.matcher(resp);
log.info(Languages.getString("SearchFrame.4")); //$NON-NLS-1$
while (movie_img_matcher.find()) {
img_src.add(new URL(movie_img_matcher.group(1)));
names.add(movie_img_matcher.group(2));
}
log.info(Languages.getString("SearchFrame.5") + img_src.size() + Languages.getString("SearchFrame.6")); //$NON-NLS-1$ //$NON-NLS-2$
log.info(Languages.getString("SearchFrame.7")); //$NON-NLS-1$
while (movie_stream_matcher.find() && mov_src.size() < img_src.size()) {
mov_src.add(new URL(movie_stream_matcher.group(1) + "stream")); //$NON-NLS-1$
}
log.info(Languages.getString("SearchFrame.5") + mov_src.size() + Languages.getString("SearchFrame.8")); //$NON-NLS-1$ //$NON-NLS-2$
log.info(Languages.getString("SearchFrame.9")); //$NON-NLS-1$
for (int i = 0; i < mov_src.size(); i++) {
log.debug(Languages.getString("SearchFrame.10")); //$NON-NLS-1$
String response = ConnectionUtils.request(mov_src.get(i).toString());
ConnectionUtils.getLastPage();
Matcher movie_link_matcher = MOVIE_LINK_PATTERN.matcher(response);
log.debug(Languages.getString("SearchFrame.11")); //$NON-NLS-1$
if (movie_link_matcher.find()) {
res.add(movie_link_matcher.group(2));
con = getCon(new URL(movie_link_matcher.group(1).replaceAll("\\\\/", "/")), "HEAD");
log.debug(Languages.getString("SearchFrame.12")); //$NON-NLS-1$
last_modified.add(con.getHeaderField("Last-Modified")); //$NON-NLS-1$
sizes.add(i, con.getContentLengthLong());
}
if(Options.getString("DefaultDownload").equals("0")){
dirs.add(i, System.getProperty("user.home") + "\\Videos"); //$NON-NLS-1$ //$NON-NLS-2$
} else {
dirs.add(i, Options.getString("DefaultDownload"));
}
}
log.debug(Languages.getString("SearchFrame.13")); //$NON-NLS-1$
for(int i = 0; i < mov_src.size(); i++){
try{
model.addElement(new Movie(mov_src.get(i), img_src.get(i), names.get(i), res.get(i), dirs.get(i), last_modified.get(i), sizes.get(i)));
} catch(IndexOutOfBoundsException ex){
log.info(ex);
}
}
} catch(Exception ex){
log.error(ex);
}
}
答案 0 :(得分:0)
如果您希望使用方法调用isInterrupted()
或interrupted()
进行检查,并且如果线程已被中断,则必须在每个循环迭代中插入代码并在其他位置插入线。在父线程中,您需要在要停止的线程上调用interrupt()
方法。然后,当你的子线程检查它是否被中断时,它将知道返回。请阅读有关课程Thread的java doc中提到的方法的更多信息。杀死线程的唯一安全方法是让线程本身停止。任何其他方式本质上都是危险的。这就是方法stop()已被删除的原因