2016-11-27 4 views
0

したがって、私は停止したいループのないスレッドを持っています。私はインターネットを検索し、ループスレッドを作成せずに解決策を見つけられませんでした。 スレッドは、Webサーバーに情報を要求し、その結果をJListに表示します。永遠にループしません。この機能をスレッドにした理由は、Webサーバーから送信される情報の量に応じて約1〜5分かかり、リクエストでブロックされずにアプリケーションで作業を続けたいからです。スレッドは次のようになります。Javaのループの非ループThread

public class Search extends Thread implements Runnable{ 
    @Override 
    public void run(){ 
     requestToWebServer(); //10-20sec 
     receiveInformation(); //10-20sec 
     handleResponse(); //1-4min 
     addDataToJList(); //5sec 
    } 
} 

私の問題は、このスレッドが完全に実行されないようにする方法がないことです。私は、廃止予定のメソッドThread.stopを使用したくありません。

編集:runメソッド内 完全なコード:

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

メソッド呼び出しの間で割り込みステータスをチェックしないのはなぜですか? –

+1

たとえば、if(Thread.currentThread()。isInterrupted()){return; } ' –

+1

これはコード全体のものではなく、コードの内容の概要です。コードそのものは約60行であり、http reqestの間にステータスを確認することはできません。 –

答えて

0

あなたはメソッド呼び出しisInterrupted()またはinterrupted()と確認を希望する場合は、各ループの繰り返しの中に、いくつかの他の場所で、あなたのコードに挿入する必要がありますスレッドが中断された場合はスレッドから戻ってくるだけです。あなたの親スレッドでは、停止するスレッドでinterrupt()メソッドを呼び出す必要があります。次に、あなたの子スレッドが中断されたかどうかを確認する次回は、返すことを知っています。クラスThreadのjava docに記載されているメソッドを詳しく読んでください。スレッドを殺す唯一の安全な方法は、スレッド自身に停止を依頼することです。それ以外の方法は本質的に危険です。そのため、メソッドstop()が無効になったのはなぜですか?

+0

上記の回答に追加するには、割り込みに関するJavaチュートリアルを参照してください。http://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html – AlexC