1

私はマルチスレッド プログラミング (私にとっては新しい) を実験しようとしていますが、いくつか質問があります。

私は、ThreadPoolTaskExecutor実装する TestTask とX 秒間スリープRunnableするメソッドを使用しています。runすべてがスムーズに進み、すべての TestTask が別のスレッドで実行されました。Ok。ここで難しいのは、スレッドで行われた操作の結果を知りたいということです。だから私はGoogle/stack/etcでいくつかのものを読んで、使用しようとしましたFuture. そして、それはもううまく機能していません:/

メソッドを使用してgetメソッドの結果を取得し(本当に?)、callその部分は機能していますが、TestTaskは次々に実行されます(以前のように同時にではありません)。だから私は何かを正しく理解していなかったと思いますが、何がわからないのですか...そしてそれがあなたの助けが必要な理由です!

テストを起動するクラス:

public void test(String test) {

    int max = 5;
    for (int i = 0; i < max; i++) {
        TestThreadService.launch(i);
    }
    System.out.println("END");

}

TestThreadService クラス:

public class TestThreadService {

private ThreadPoolTaskExecutor taskExecutor;

public void launch(int i) {
    System.out.println("ThreadNumber : "+i);
    taskExecutor.setWaitForTasksToCompleteOnShutdown(false);
    TestTask testTask = new TestTask(i);
    FutureTask<Integer> futureOne = new FutureTask<Integer>(testTask);
    taskExecutor.submit(futureOne);
    try {
        Integer result = futureOne.get();
        System.out.println("LAUNCH result : "+i+" - "+result);
    } catch (Exception e) {
        e.printStackTrace();
    }
  }

public void setTaskExecutor(ThreadPoolTaskExecutor taskExecutor) {
  this.taskExecutor = taskExecutor;
}

}

そして TestTask クラス:

public class TestTask implements Callable<Integer> {

public Integer threadNumber;
private Integer valeur;

  public TestTask(int i) {
    this.threadNumber = i;
  }

  public void setThreadNumber(Integer threadNumber) {
    this.threadNumber = threadNumber;
  }

    @Override
    public Integer call() throws Exception {
        System.out.println("Thread start " + threadNumber);
        // generate sleeping time
        Random r = new Random();
        valeur = 5000 + r.nextInt(15000 - 5000);
        System.out.println("Thread pause " + threadNumber + " " + valeur);
        try {
            Thread.sleep(valeur);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Thread stop" + threadNumber);
        return this.valeur;
    }

}

私はJavaが苦手ではありませんが、別のスレッドを使用しようとするのはこれが初めてなので、私にとっては新しいことです。

私は何を間違っていますか?

ありがとう !

4

2 に答える 2

1

あなたのtest方法では、

TestThreadService.launch(1);

おそらくあるはずです

TestThreadService.launch(i);

主なものは

Integer result = futureOne.get();

メソッドを呼び出しますlaunch。FutureTaskget()の呼び出しはブロック操作です。つまり、タスクが完了するまで戻りません。そのため、一連の動作が見られます。エミュレートしているユースケース (一連のアクティビティをファーミングし、それらが完了するのを待つ) は、ThreadPoolTask​​Executor が理想的に適しているものではありません。生のスレッドが持つ「結合」機能はありません。そうは言っても、あなたがやりたいことは次のようなものです

public Future<Integer> launch(int i) {
    System.out.println("ThreadNumber : "+i);
    taskExecutor.setWaitForTasksToCompleteOnShutdown(false);
    TestTask testTask = new TestTask(i);
    FutureTask<Integer> futureOne = new FutureTask<Integer>(testTask);
    return taskExecutor.submit(futureOne);
  }

そして、あなたのテストメソッドで

public void test(String test) {
    List<Future<Integer>> tasks = new ArrayList<Future<Integer>>();
    int max = 5;
    for (int i = 0; i < max; i++) {
        tasks.add(TestThreadService.launch(i));
    }
    for (Future<Integer> task : tasks) {
        System.out.println("LAUNCH result : " + task.get());
    }
    System.out.println("END");

}
于 2011-08-19T13:43:23.743 に答える
0

また、setWaitForTasksToCompleteOnShutdown(false) を別のメソッドに移動することもできます。これは、スレッドを起動するたびに呼び出されないようにするためです。これは、私が見るように (あまり多くのスレッドではありません)、別のシナリオでは、より多くのタスクがあります: 不要で高価な仕事。

次のように呼ばれるサービスのパブリック メソッドを作成することもできます。または、pre-launch(); スレッドの作成を開始する前に。

グルック!

于 2012-08-27T00:24:42.360 に答える