相关疑难解决方法(0)

如何使用ExecutorService等待所有线程完成?

我需要一次执行4个任务,如下所示:

ExecutorService taskExecutor = Executors.newFixedThreadPool(4);
while(...) {
    taskExecutor.execute(new MyTask());
}
//...wait for completion somehow
Run Code Online (Sandbox Code Playgroud)

一旦完成所有内容,我该如何收到通知?现在我想不出比设置一些全局任务计数器更好的事情,并在每个任务结束时减少它,然后在无限循环中监视这个计数器变为0; 或获得一个Futures列表,并在无限循环监视器isDone中为所有这些.什么是更好的解决方案不涉及无限循环?

谢谢.

java parallel-processing concurrency multithreading executorservice

362
推荐指数
11
解决办法
30万
查看次数

SwingUtilities中的invokeAndWait方法

请解释SwingUtilities中的invokeAndWait()方法.我无法理解这一点. 非常清楚地解释一下. 如果你尝试一个例子,那将是很有帮助的.

编辑添加@ noob扩展问题:

什么是不太清楚这个

这是一个修改过的用法示例:

import javax.swing.SwingUtilities;

public class InvokeAndWaitStuff 
{
    public static void main(String[] args)
    {
        final Runnable doHelloWorld = new Runnable() {
             public void run() {
                 System.out.println("Hello World on " + Thread.currentThread());
             }
         };

         Thread appThread = new Thread() {
             public void run() {
                 try {
                     SwingUtilities.invokeAndWait(doHelloWorld);
                 }
                 catch (Exception e) {
                     e.printStackTrace();
                 }
                 System.out.println("Finished on " + Thread.currentThread());
             }
         };
         appThread.start();
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

Hello World on Thread[AWT-EventQueue-0,6,main]
Finished on Thread[Thread-0,5,main]
Run Code Online (Sandbox Code Playgroud)

为什么这很重要?:

导致doHelloWorld.run()在AWT事件派发线程上同步执行.此调用将阻塞,直到处理完所有待处理的AWT事件,并且(然后)doHelloWorld.run()返回.当应用程序线程需要更新GUI时,应使用此方法. …

java swing

19
推荐指数
1
解决办法
3万
查看次数

Java Executors:如何停止提交的任务?

我已经使用执行程序提交了一个任务,我需要它在一段时间后停止(例如5分钟).我试过这样做:

   for (Future<?> fut : e.invokeAll(tasks, 300, TimeUnit.SECONDS)) {
         try {
             fut.get(); 
         } catch (CancellationException ex) {
             fut.cancel(true);   
             tasks.clear();
         } catch(ExecutionException ex){
             ex.printStackTrace(); //FIXME: gestita con printstack       
         }
   }
Run Code Online (Sandbox Code Playgroud)

但我总是得到一个错误:我有一个需要被任务修改然后由线程读取的共享Vector,即使我停止所有任务,如果超时发生,我得到:

Exception in thread "Thread-1" java.util.ConcurrentModificationException
Run Code Online (Sandbox Code Playgroud)

有什么不对?如何停止提交的5分钟后仍在工作的任务?

java multithreading executorservice

12
推荐指数
1
解决办法
3万
查看次数

Java并行工作迭代器?

我正在寻找一个类,我可以覆盖一个方法来完成工作,并像迭代器一样返回结果.像这样的东西:

ParallelWorkIterator<Result> itr = new ParallelWorkIterator<Result>(trials,threads) {

  public Result work() {
    //do work here for a single trial...
    return answer;
  }

};
while (itr.hasNext()) {
  Result result = itr.next();
  //process result...
}
Run Code Online (Sandbox Code Playgroud)

这主要用于monte carlo模拟之类的东西,但我不想每次都要处理设置线程池和管理返回线程.我推出了自己的课程,希望能够完成这一课,但我对此并不充分,并且认为我会检查这样的事情是否已经存在.

编辑:要清楚,我希望它在后台运行并在每个工作方法返回后排队结果,直到所有试验都完成.因此,下一个方法可能会等待返回,直到队列中出现结果.

java concurrency multithreading iterator

5
推荐指数
1
解决办法
5260
查看次数

Java中的线程作业

我想在Java中同时生成200个线程.我现在正在做的是进入循环并创建200个线程并启动它们.完成这200个后,我想生成另外200个线程,依此类推.

这里的要点是我产生的前200个线程需要在产生下一组之前完成.我尝试了下面的代码,但它不起作用

for(int i=0;i<200;i++){
    Thread myThread = new Thread(runnableInstance);
    myThread.start();
}
for(int i=0;i<200;i++){
    Thread myThread = new Thread(runnableInstance);
    myThread.start();
}
Run Code Online (Sandbox Code Playgroud)

注意:我故意将for循环放两次,但我想要的效果并不是因为第二个for循环在第一组线程结束执行之前执行.

请指教

java multithreading

4
推荐指数
3
解决办法
3962
查看次数