我正在尝试同时运行多个线程,其中每个线程都计算特定时间点的值并返回结果。我正在考虑使用Executor类,但似乎没有正确地执行它。我想知道这段代码是否正确。或者这样做的最佳方式是什么?
ExecutorService tasker = Executors.newFixedThreadPool(20);
for(double t = 0.0; t<=5.0; t = t + 0.50 ){ // t is time interval
tasker.execute(new MyThread(t));
}
答案 0 :(得分:4)
你不需要在execute方法中传递一个Thread。 相反,您需要传递一个Runnable对象,如下所示:
ExecutorService tasker = Executors.newFixedThreadPool(20);
for(double t = 0.0; t<=5.0; t = t + 0.50 ){ // t is time interval
tasker.execute(new MyRunnable(t));
}
....
....
class MyRunnable implements Runnable
{
MyRunnable(double i)
{
System.out.println(i);
...
}
}
答案 1 :(得分:1)
要真正同时运行10-15个线程,您需要拥有10-15个免费核心。但是,如果您拥有这么多可用内核,则需要确保拥有至少包含这么多线程的池,并且至少需要执行这么多任务。
对于CPU绑定进程,最佳线程数通常是您拥有的核心数。 (有时用超线程加倍)
需要注意的是使用float
或double
的循环。这些类型可能会出现舍入错误,每次迭代都会累积。使用整数并计算你的价值要好得多。
for(int i=0;i<=10;i++) {
double t= i/2.0;
tasker.execute(new MyRunnable(t));
}