как эффективно запускать 10-15 потоков одновременно

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