在线程上调用不同的方法

时间:2012-08-28 09:23:38

标签: java multithreading

我有一个主进程main。它会创建10个线程(比方说)然后我想要做的是以下内容:

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

现在我有了这些线程的列表,并且对于每个线程,我想做一组进程,对所有进程都相同,因此我将该实现放在ClassImplementingRunnable的run方法中。

现在线程完成执行后,我想等待所有线程停止,然后再次唤起它们,但这次我想连续不并行地执行它们。

为此我加入每个线程,等待它们完成执行但在那之后我不知道如何再次唤起它们并连续运行那段代码。 我可以做点什么吗

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 个答案:

答案 0 :(得分:3)

如果您想要串行执行,只需使用

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

所有任务将在同一个线程中一个接一个地运行。这是达到你想要的最干净的方式。

更新

在您的评论之后,很明显您实际上不想再次运行相同的任务,而是打印由他们计算的结果。这会更简单:

  1. ClassImplementingRunnable个实例添加到任务列表中;
  2. 在自己的线程中运行每个任务;
  3. 加入所有主题;
  4. 编写一个for循环,打印每个ClassImplementingRunnable实例的结果。
  5. 你已经有2和3。

答案 1 :(得分:3)

您无法重新启动线程。

你可以做的是使用java.util.concurrent包来等待线程完成并重新运行主线程中的runnables以顺序运行它们 - 通过将runnable放入列表中,你可以在顺序运行。

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(); 
}

答案 2 :(得分:0)

我想你想要类似的东西 的 ExecutorCompletionService

从Java doc。

复制的示例
  

用法示例。假设您有一组针对某个问题的求解器,每个求解器返回某种类型的Result值,并希望同时运行它们,处理每个问题的结果返回一个非null值,在某些方法中使用(Result 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);
   }

}

答案 3 :(得分: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();
}

请注意,我已将您的课程更改为扩展Thread。通常最好像你一样实现Runnable,但如果你要加入并回调对象,扩展Thread会使代码更容易。

因此,您创建对象实例,将它们作为线程启动,然后join()与它们一起等待它们完成并同步它们的内存。使用该线程join()后,您可以调用您喜欢的对象上的任何方法。这根本不会“重新唤起”线程。它只是访问对象内部的字段。如果您在线程运行时尝试执行此操作,则需要担心synchronization