#java #multithreading
#java #многопоточность
Вопрос:
Я пытаюсь запустить несколько потоков одновременно, где каждый поток вычисляет значение для определенного момента времени и возвращает результат. Я думал об использовании класса 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));
}
Комментарии:
1. @Richard. действительно ли это означает, что у меня разные потоки, вычисляемые за разные промежутки времени? я был немного смущен тем, как работают исполнители
Ответ №1:
Вам не нужно передавать поток внутри метода execute. Вместо этого вам нужно передать выполняемый объект, например:
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. Не является
t
double
скорее, чемint
Ответ №2:
Чтобы действительно запускать 10-15 потоков одновременно, вам нужно иметь 10-15 свободных ядер. Однако, если у вас есть такое количество свободных ядер, вам нужно убедиться, что у вас есть пул с по крайней мере таким количеством потоков и по крайней мере таким количеством задач.
Для процессов, связанных с процессором, оптимальное количество потоков часто соответствует количеству имеющихся у вас ядер. (Иногда удваивается с помощью hyper-threading)
Следует остерегаться циклов, которые используют float
или double
эти типы, которые могут иметь ошибку округления, которая накапливается с каждой итерацией. Гораздо лучше использовать целое число и вычислять свое значение.
for(int i=0;i<=10;i ) {
double t= i/2.0;
tasker.execute(new MyRunnable(t));
}