1

我正在尝试尝试多线程编程(对我来说是新的),我有一些问题。

我正在使用一个ThreadPoolTaskExecutor带有实现的 TestTaskRunnable和一个run休眠 X 秒的方法。一切都很顺利,我所有的 TestTask 都在不同的线程中执行。好的。现在棘手的部分是我想知道在线程中进行的操作的结果。因此,我在 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方法。调用get()FutureTask 是一个阻塞操作,这意味着它在任务完成之前不会返回。这就是为什么您会看到连续行为。您正在模拟的用例(耕种一堆活动并等待它们完成)不是 ThreadPoolTask​​Executor 非常适合的用例。它没有原始线程所具有的“加入”功能。那beeing说,你想做的是像

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) 移动到另一个方法中,以便在每次启动线程时都不会被调用,正如我所见,(不是很多线程),但在另一种情况下,有更多任务:一个不必要的和昂贵的工作。

您还可以在服务上创建一个公共方法,称为:configure();或者,预启动();在开始创建线程之前。

幸运!

于 2012-08-27T00:24:42.360 回答