Я использовал два разных подхода для измерения времени потоков, но результат не соответствует
**Public void Main()**
{
Timer timer = new Timer();
int timetotal;
timer.start();
int numberOfThreads=5;
ExecutorService pool= Executors.newFixedThreadPool(numberOfThreads);
List<Future<Boolean>> futureList = new ArrayList<Future<Boolean>>();
Set<ReadProcess_MongoDB> callList = new HashSet<ReadProcess_MongoDB>();
CompletionService<ReadProcess_MongoDB> taskCompletionService;
taskCompletionService = new ExecutorCompletionService<ReadProcess_MongoDB>(pool);
Collection<Callable<ReadProcess_MongoDB>> list;
list = new LinkedList<Callable<ReadProcess_MongoDB>>();
for(int i=0;i<numberOfThreads;i++)
list.add((Callable<ReadProcess_MongoDB>) new ReadProcess_MongoDB(i));
try {
for (Callable<ReadProcess_MongoDB> callable : list) {
taskCompletionService.submit(callable);
}
for (int i = 0; i < list.size(); i++) {
Future<ReadProcess_MongoDB> result = taskCompletionService.take();
}
} catch (InterruptedException e) {
// no real error handling. Don't do this in production!
e.printStackTrace();
} catch (ExecutionException e) {
// no real error handling. Don't do this in production!
e.printStackTrace();
}
finally {
pool.shutdown();
System.out.println("Done :)");
timer.stop();
System.out.println("Total consumed Time"+ timer.elapsed());
}
В другое время я ввел метод вызова()
**public String call()**
{
Timer timer = new Timer();
int timetotal;
timer.start();
DBCursor cursor = coll.find(whereQuery);
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
Logger.getLogger(ReadProcess_MongoDB.class.getName()).log(Level.SEVERE, null, ex);
}
timer.stop();
usedTimeForQueryProcess = timer.elapsed();
System.out.println("Thread Number="+this.threadNumber+ " MongoDB_readQuery used time "+usedTimeForQueryProcess);
System.out.println("runing.....");
return Objects.toString(usedTimeForQueryProcess);
}
В функции вызова время системной печати каждого потока и в функции Main отображается только общее время. Здесь я пытаюсь проверить вручную, но оба раза не совпадают. Но большая проблема заключается в том, что функция Main показывает меньше времени, чем общее время всех потоков (функция вызова),
Я также попытался вернуть время использования из функции вызова. Но он также создает проблему с преобразованием в длинную (особенно проблему времени выполнения).
Время обеих функций
Главное время функции = 289 Время функции вызова = 510 (5 потоков).
Удовлетворит ли кто-нибудь, почему это происходит и как я могу сделать правильное измерение?
Главное время ниже, чем общее количество ваших заданий, потому что они работают параллельно. Если вы уменьшите размер пула потоков до 1, то числа будут больше похожими на то, что вы ожидаете.
Это одно из преимуществ выполнения многопоточного программирования, что позволяет сделать больше работы за меньшее время, чем если бы это было сделано последовательно.