1

順序を尊重してスレッドで多くのタスクを実行したいのですが、これがアプリケーションのメインスレッドです:

@Component
public class LogExtractorApp extends CommonApp implements Runnable {

    UDPReceiver receiver = new UDPReceiver();

    public static Map<String, Entity> select;
    public static List<String> pdomain;

    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

    @Resource
    MessagesCounts counters;

    @Resource
    DbUpdating update;

    @Resource
    DeleteData delete;

    @Resource
    ExcludeDomain domain;   

    @Override
    public void run() {
       select = counters.main();
       pdomain = domain.main();
       ExecutorService service = Executors.newCachedThreadPool();
       service.execute(receiver);
       scheduler.scheduleAtFixedRate(update, 5, 5, TimeUnit.MINUTES);
       service.execute(delete);
    }
}

アプリケーションを起動するときに必要なのは次のとおりです。

  1. カウンターのメイン メソッドを呼び出します。
  2. ドメインのメイン メソッドを呼び出します。
  3. スレッド「レシーバー」を起動します。このスレッドは、離れたサーバーから永続的にデータを受信します。
  4. スケジュールされたスレッドを起動して、5 分ごとにデータベースを更新します。
  5. カウンターの主な方法を思い出してください。(ここで、マップ「select」は、スレッド「レシーバー」によって呼び出されるメソッドで使用されることに言及します)。
  6. スレッド「delete」を起動して削除し、データベースから 1 日より古いすべてのデータを削除します。

*もちろん、三本の糸が永久に回転することを望んでいます*

私の質問: ステップ 1,2,3,4 は正常に動作しますが、「更新」スレッドの後に毎回「カウンター」のメイン メソッドを呼び出すようにアプリケーションに指示して、マップの値を更新する方法がわかりません ( "選択する")。そして、「削除」スレッドについては、上記のコードに示されている方法で追加していましたが、このようには機能しません。私の2つの質問に対する提案に感謝します.質問に他のコードを追加する必要がある場合は、コメントで教えてください.

ありがとうございました!

4

1 に答える 1

1

ステップ 5 については、timerTask クラスが役立ちます。参照: http://enos.itcollege.ee/~jpoial/docs/tutorial/essential/threads/timer.html詳細については、 Java ドキュメントを参照してください。

timerTask を拡張すると、ステップ 6 も実行 できますが、Java タスクをスケジュールするための別の優れたツールがあります。

于 2013-11-07T09:22:48.987 に答える