我需要一次执行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
请解释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时,应使用此方法. …
我已经使用执行程序提交了一个任务,我需要它在一段时间后停止(例如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分钟后仍在工作的任务?
我正在寻找一个类,我可以覆盖一个方法来完成工作,并像迭代器一样返回结果.像这样的东西:
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中同时生成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循环在第一组线程结束执行之前执行.
请指教