2

マルチスレッドコードから複数のスレッドを生成するプロジェクトに取り組んでいます。

10 個のスレッドを生成すると仮定すると、各スレッドが特定の期間実行されていることを確認する必要があります。

たとえば、each thread実行する必要がある場合30 minutesは、config.propertiesファイルで、次のようになりますTOTAL_RUNNING_TIME=30

そこで、各スレッドが実行されていることを確認するために、以下の設計を思いつきました30 minutes

private static long durationOfRun;
private static long sleepTime;

 public static void main(String[] args) {

      // create thread pool with given size
      ExecutorService service = Executors.newFixedThreadPool(threads);

      try {

           readPropertyFile();

           for (int i = 0; i < threads; i++) {
                service.submit(new ReadTask(durationOfRun, sleepTime));
           }
      }
 }

 private static void readPropertyFile() throws IOException {
      prop.load(Read.class.getClassLoader().getResourceAsStream("config.properties"));

      threads = Integer.parseInt(prop.getProperty("NUMBER_OF_THREADS"));
      durationOfRun = Long.parseLong(prop.getProperty("TOTAL_RUNNING_TIME"));
      sleepTime = Long.parseLong(prop.getProperty("SLEEP_TIME"));
 }

以下は私の ReadTask クラスです。

class ReadTask implements Runnable {
     private long durationOfRun;
     private long sleepTime;

     public ReadTask(long durationOfRun, long sleepTime) {
          this.durationOfRun = durationOfRun;
          this.sleepTime = sleepTime;
     }

     @Override
     public void run() {

          long startTime = System.currentTimeMillis();
          long endTime = startTime + (durationOfRun*60*1000);

          //Each thread is running less than endTime
          while(System.currentTimeMillis() <= endTime) {

               //Do whatever you want to do

          }

     Thread.sleep(sleepTime);
     }
}

私の run メソッドを見ると、時間をチェックする while ループがあります。では、各スレッドを特定の期間実行するというこのアプローチは正しいですか? それとももっと良い方法もありますか?他のより良いアプローチがある場合、またはこれも目的に役立つ場合は、私の無知を無視してください。

ここにもスレッドセーフの問題があるかどうか教えてください。

私が探しているのは、各スレッドが 30 分間実行され、そのスレッドの時間が終了した場合は、現在実行中のタスクを完了し、その後shutdownExecutorService. これよりも優れたアプローチまたは優れた設計があれば。私の知識の観点からそのことを学ぶことができるように、いくつかの例を教えてください。助けてくれてありがとう。

アップデート:-

run メソッドの while ループを調べると、その while ループ内でSelect call to the database. だから私が探しているのはこのようなものです-そのスレッドの時間が終了するとすぐに、データベースへの他の選択呼び出しを行わず、以前に行っていたことをすべて終了します。のようにshutdown動作しExecutorServiceます。

そして、私はこのシナリオを望んでいません-そのスレッドの時間が終了するとすぐに、可能な限りスレッドをタイムアウトさせます。その特定のスレッドはその期間にデータベースへの選択を行っていましたか?

4

2 に答える 2

1

この設計に関して私が懸念していることの1つは、whileループ内で実行される作業の量が、私たちの時間により多くかかる場合はどうなるかということです。

例えば

while(System.currentTimeMillis() <= endTime) {

    calaculateTheMeaningOfLife();

}

今、何が起きた?スレッドを停止したり、タイムアウトをチェックするように促したりするのは何ですか?ファイルやソケットの読み取り/書き込みなどのブロック操作がある場合も同じことが起こります

スレッドを中断することもできますが、これが役立つという保証はありません。

于 2013-02-24T02:12:33.480 に答える
0

エグゼキュータに制限時間を設定できます。Executors によって返されたエグゼキュータをキャストし、時間制限を設定する必要があります。

ThreadPoolExecutor service = (ThreadPoolExecutor) Executors.newFixedThreadPool(4);
service.setKeepAliveTime(1800, TimeUnit.SECONDS);

Brian Goetz による「Java Concurrency in Practice」から引用。

于 2013-02-23T22:34:53.590 に答える