2

ディレクトリに含まれる各ファイル内の単語を検索するアプリケーションを作成しました。検索を停止する方法を実装したかったのです。ディレクトリで見つかった各ファイルの種類に応じて、他のさまざまなメソッドを呼び出すメソッドを作成しました。私は1つのクラスで働いており、JButtonそのリクエスト停止検索を作成しました:

 private void jButtonActionPerformed(java.awt.event.ActionEvent evt) 
    {                                         
            System.out.println("Requesting stop");
    }   

ディレクトリを検索するメソッドを停止する方法が必要です。私のメソッドがsearch(directory);.

私はこのようにしようとしsearch(directory);ました:

private Thread a;
a = new Thread(new Runnable() { 
     @Override
     public void run() {
       search(directory);
     }
        } 
  );

検索中に をクリックしjButtonて検索を停止します。

 private void jButtonActionPerformed(java.awt.event.ActionEvent evt) 
    {             
            System.out.println("Requesting stop");                            
            a.stop(); 
    } 

それは機能しますが、これに関する多くの投稿を読んでいますが、スレッドを停止するのは良い方法ではありません. では、代替案はありますか?例を挙げていただけますか?

私もこれを試しました:

java.util.TimerTask timerTask;
ScheduledThreadPoolExecutor scheduledThread = new ScheduledThreadPoolExecutor(10);
timerTask = new  java.util.TimerTask() {
        @Override
        public void run() {
            search(directory);
        }
    };
scheduledThread.schedule(timerTask, 3, TimeUnit.MILLISECONDS);

そして次にjButtonActionPerformed

 private void jButtonActionPerformed(java.awt.event.ActionEvent evt) 
    {                                         
       System.out.println("Requesting stop");
       scheduledThread.shutdownNow();
    } 

それも機能しますが、この場合、新しい検索を開始しようとしても開始できません。アプリケーションを閉じて再度開く必要があります。

4

1 に答える 1

2

一方通行:

  • 検索を行うコードは、独自のクラスにある必要があります。
  • GUI コントローラー (たとえば、ActionListener) は、このクラスのオブジェクトを作成します。
  • GUI で Search クラスに検索を実行させたい場合は、おそらくbeginSearch()バックグラウンド スレッドでそのクラスのメソッドを呼び出す必要があります。
  • Search クラスには、アクティブな検索を停止するためのメソッドが必要です。たとえばstopSearch()、GUI コントローラーが呼び出すことができます。
  • このメソッドはおそらく、検索オブジェクトのブール値フィールドflagcontinueSearchingを設定します。たとえば、呼び出されたものなど、検索メソッドが検索中に断続的にチェックするものです。ブール値が false に設定されている場合、検索は停止するはずです。

また、あなたが正しいことに注意してください。スレッドでの呼び出しstop()は推奨されないだけでなく、非常に危険です。Thread APIがこの件に関して何を言っているのかを見てください。

非推奨。この方法は本質的に安全ではありません。Thread.stop でスレッドを停止すると、ロックされているすべてのモニターのロックが解除されます (チェックされていない ThreadDeath 例外がスタックに伝播する自然な結果として)。これらのモニターによって以前に保護されたオブジェクトのいずれかが不整合な状態にあった場合、破損したオブジェクトが他のスレッドから見えるようになり、任意の動作が発生する可能性があります。stop の多くの使用は、単に変数を変更して、ターゲット スレッドの実行を停止する必要があることを示すコードに置き換える必要があります。ターゲット スレッドは、この変数を定期的にチェックし、変数が実行を停止することを示している場合は、適切な方法で run メソッドから戻る必要があります。ターゲット スレッドが (条件変数などで) 長時間待機する場合、

また、次のリンクもご覧ください: Why is Thread.stop deprecated? .


あなたの状態を編集
:

問題は、私のアプリケーション コードが長く、あなたのように編集するのが難しいことです...

クラスが長くなればなるほど、それを個別の論理ユニットに分割することがより重要になります。そうしないと、デバッグと機能強化の悪夢に悩まされることになります。

私はプログラミングの専門家ではなく、まだ勉強中なので、自分の状況に応じた方法があるかどうかを知りたかったのです。

リファクタリングを練習すればするほど、上手になり、簡単になります。始めるには今が良い時期です。

于 2013-07-14T17:07:47.833 に答える