Это правильный способ для синхронизации параллельных потоков в Java
Мне нужно время, сколько нужно времени, чтобы запустить каждый поток приложения, которое я написал, и я закончил и получил результат, но на самом деле у меня нет хорошего способа убедиться, что я все сделал правильно. Я никогда не делал ничего подобного раньше. Если бы кто-то мог дать мне быструю корректуру, это было бы очень полезно.
Вот код, создающий потоки:
for (int i = 0; i < ROWS; i++) {
threads[threadCount] = new Thread(new TextDistanceThread("Macbeth.txt", "Othello.txt", i, 0));
threads[threadCount++].start();
threads[threadCount] = new Thread(new TextDistanceThread("Macbeth.txt", "HuckFinn.txt", i, 1));
threads[threadCount++].start();
threads[threadCount] = new Thread(new TextDistanceThread("Macbeth.txt", "TomSawyer.txt", i, 2));
threads[threadCount++].start();
threads[threadCount] = new Thread(new TextDistanceThread("Othello.txt", "HuckFinn.txt", i, 3));
threads[threadCount++].start();
threads[threadCount] = new Thread(new TextDistanceThread("Othello.txt", "TomSawyer.txt", i, 4));
threads[threadCount++].start();
threads[threadCount] = new Thread(new TextDistanceThread("TomSawyer.txt", "HuckFinn.txt", i, 5));
threads[threadCount++].start();
}
И код самого потока:
public void run() {
long start = ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime();
//DO SOME STUFF
long end = ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime();
Driver.timeResults[0][row][col] = end - start;
Driver.results[row][col] = difference;
}
2 ответа
Вы хотите, чтобы истекшее время для каждого потока или "реальное" истекшее время из System.currentTime()
; Ваш код получает время для каждого потока, которое не всегда совпадает с фактическим прошедшим временем. Если это то, что вы хотели, ваша реализация должна работать.
Простой способ проверить поведение времени - запустить задачу в течение известного промежутка времени. Thread.sleep()
, например. Попробуйте сравнить Thread.sleep()
занятым ожиданием (т.е. while(System.currentTimeMillis() < timeInTheFuture) {}
), вы заметите, что время процессора, скорее всего, будет другим. Не ожидайте высокой точности, но вы все равно можете использовать ее для проверки своих предположений. Если вы запускаете пять потоков, каждый из которых работает по 30 секунд, вы получаете ~30 секунд назад для каждого потока? Тогда он делает то, что вы ожидаете.
Тем не менее, похоже, что вы храните информацию о времени в массиве, что не очень хорошая идея. Массивы не являются потокобезопасными. Для вашего случая, вероятно, было бы проще всего создать ConcurrentHashMap<String, Long>
где ключ это имя потока, например
timeResults.put(Thread.currentThread().getName(), end - start);
Если вы хотите измерить время, затрачиваемое в каждом потоке на ЦП, то да, ваш код выглядит правильно. Обратите внимание, что он не измеряет фактическое время от начала потока до его завершения - для этого вы бы использовали System.nanoTime()
,