Java停止非循环线程

时间:2016-11-27 13:57:08

标签: java multithreading user-interface

所以,我有一个非循环的线程,我想停止。我搜索了互联网,没有创建一个循环线程没有找到解决方案。 线程从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);
    }
}

1 个答案:

答案 0 :(得分:0)

如果您希望使用方法调用isInterrupted()interrupted()进行检查,并且如果线程已被中断,则必须在每个循环迭代中插入代码并在其他位置插入线。在父线程中,您需要在要停止的线程上调用interrupt()方法。然后,当你的子线程检查它是否被中断时,它将知道返回。请阅读有关课程Thread的java doc中提到的方法的更多信息。杀死线程的唯一安全方法是让线程本身停止。任何其他方式本质上都是危险的。这就是方法stop()已被删除的原因