0

メインプロセスがありますmain。それは10個のスレッドを作成し(たとえば)、それから私がやりたいことは次のとおりです:

while(required){
Thread t= new Thread(new ClassImplementingRunnable());
t.start();
counter++;
}

これで、これらのスレッドのリストができました。スレッドごとに、すべて同じプロセスのセットを実行したいので、その実装をのrunメソッドに入れClassImplementingRunnableます。

スレッドの実行が完了したら、すべてのスレッドが停止するのを待ってから、スレッドを再度呼び出しますが、今回は、並列ではなく連続して実行したいと思います。

このために、私は各スレッドに参加して、実行が完了するのを待ちますが、その後、それらを再度呼び出して、そのコードを連続して実行する方法がわかりません。私は次のようなことをすることができますか

for(each thread){
t.reevoke(); //how can i do that.
t.doThis();  // Also where does `dothis()` go, given that my ClassImplementingRunnable is an inner class.
}

また、同じスレッドを使用したいのですが、中断したところから連続して続行したいのです。擬似コードの最後の部分をどうやって処理するかわかりません。親切に助けてください。Javaでの作業。

4

4 に答える 4

3

シリアル実行が必要な場合は、

for (int i = 0; i < 10; i++)
  new ClassImplementingRunnable().run();

すべてのタスクは同じスレッドで次々に実行されます。これはあなたが望むものを達成するための最もクリーンな方法です。

アップデート

コメントの後、実際には同じタスクを再度実行するのではなく、それらによって計算された結果を出力することを望んでいることは明らかです。これはさらに簡単です:

  1. ClassImplementingRunnableインスタンスをタスクのリストに追加します。
  2. 各タスクを独自のスレッドで実行します。
  3. すべてのスレッドに参加します。
  4. 各インスタンスforからの結果を出力するループを記述します。ClassImplementingRunnable

あなたはすでに2と3を持っています。

于 2012-08-28T09:28:59.050 に答える
3

スレッドを再開することはできません。

できることは、java.util.concurrentパッケージを使用してスレッドが終了するのを待ち、メインスレッドでランナブルを再実行して順次実行することです。ランナブルをリストに入れることで、シーケンシャル実行中にそれらにアクセスできます。

ExecutorService executor = Executors.newFixedThreadPool(10);
List<Runnable> runnables = new ArrayList<Runnable> ();

for (int i = 0; i < 10; i++) {
    Runnable r = new ClassImplementingRunnable();
    runnables.add(r);
    executor.submit(r);
}

executor.shutdown();
//wait until all tasks are finished
executor.awaitTermination(Integer.MAX_VALUE, TimeUnit.SECONDS);

//re run the tasks sequentially
for (ClassImplementingRunnable r : runnables) {
    //the method below can access some variable in 
    //your ClassImplementingRunnable object, that was 
    //set during the first parallel run
    r.doSomethingElse(); 
}
于 2012-08-28T09:31:25.280 に答える
0

ここにはいくつかの素晴らしい答えがありますが、最初の質問に答えられているかどうかはわかりません。

スレッドの実行が完了したら、すべてのスレッドが停止するのを待ってから、スレッドを再度呼び出しますが、今回は、並列ではなく連続して実行したいと思います。

実行中のスレッドをそのオブジェクトから混乱させています。次のようなことを行うのは非常に一般的なパターンです(通常はExecutiveServiceクラスで改善されますが)。

List<ClassExtendingThread> threads = new ArrayList<ClassExtendingThread>();
// create your list of objects
for (int i = 0; i < 10; i++) {
    ClassExtendingThread thread = new ClassExtendingThread(...);
    thread.start();
    threads.add(thread);
}

for (ClassExtendingThread thread : threads) {
    // now wait for each of them to finish in turn
    thread.join();
    // call some method on them to get their results
    thread.doThis();
}

クラスをextendingに変更したことに注意してくださいThread。通常は、Runnable同じように実装することをお勧めしますが、オブジェクトに参加してコールバックする場合は、拡張Threadするとコードが簡単になります。

したがって、オブジェクトインスタンスを作成し、それらをスレッドとして開始してから、それらを使用して、オブジェクトjoin()が終了するのを待ち、メモリを同期します。スレッドを使用したらjoin()、必要なオブジェクトの任意のメソッドを呼び出すことができます。それはスレッドを「再喚起」することはまったくありません。オブジェクト内のフィールドにアクセスするだけです。スレッドの実行中にこれを実行しようとすると、心配する必要がありますsynchronization

于 2012-08-29T18:21:02.430 に答える
0

ExecutorCompletionServiceのようなものが必要だと思います

Javaドキュメントからコピーされた例。

使用例。特定の問題に対するソルバーのセットがあり、それぞれが何らかのタイプの結果の値を返し、それらを同時に実行して、null以外の値を返す各ソルバーの結果を処理したいとします。 r)。あなたはこれを次のように書くことができます:

void solve(Executor e,
          Collection<Callable<Result>> solvers)
 throws InterruptedException, ExecutionException {
   CompletionService<Result> ecs
       = new ExecutorCompletionService<Result>(e);
   for (Callable<Result> s : solvers)
       ecs.submit(s);
   int n = solvers.size();
   for (int i = 0; i < n; ++i) {
       Result r = ecs.take().get();
       if (r != null)
           use(r);
   }

}

于 2012-08-28T09:31:12.457 に答える