2015-09-23 5 views
3

Мне нужно время, необходимое для запуска каждого потока приложения, которое я написал, и я закончил и получил результат, но на самом деле не очень-то хороший способ чтобы убедиться, что я сделал это правильно. Раньше я никогда не делал ничего подобного. Если кто-то может дать мне быстрый корректор, это будет очень полезно.Является ли это подходящим способом совпадения потоков времени в 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; 
} 

ответ

0

Если вы хотите измерить время, проведенное в каждом потоке на процессоре, то да, ваш код выглядит правильно. Обратите внимание, что это не измеряет фактическое время от начала потока до момента его завершения - для этого вы бы использовали System.nanoTime().

1

Вы либо хотите, чтобы прошлое, прошедшее нить, или «реальное» прошедшее время от System.currentTime(); ваш код получает время в потоке, которое не всегда будет таким же, как и фактическое прошедшее время. Если это то, что вы намеревались, ваша реализация должна работать.

Простой способ проверить временное поведение - запустить задачу в течение известной продолжительности времени. Thread.sleep(), например. Попробуйте сравнить Thread.sleep() с ожиданным ожиданием (т. Е. while(System.currentTimeMillis() < timeInTheFuture) {}), вы заметите, что времена процессора будут отличаться. Не ожидайте высокой точности, но вы все равно можете использовать ее для проверки своих предположений. Если вы запускаете пять потоков, каждый из которых работает в течение 30 секунд, вы получаете ~ 30 секунд для каждого потока? Тогда он делает то, что вы ожидаете.

При этом, похоже, что вы храните информацию о времени в массиве, что не является хорошей идеей. Arrays are not thread-safe. Для вашего случая было бы проще всего создать ConcurrentHashMap<String, Long>, где ключ - это имя потока, например.

timeResults.put(Thread.currentThread().getName(), end - start); 
+0

Хороший вопрос с идеей Thread.sleep(). Что касается массива, я подумал об этом, но действительно ли это проблема, если все потоки будут завершены до того, как я прочитаю массив? Например, если я использую Thread.join()? –

+0

@Stephen Поскольку массив создается до того, как потоки запущены, каждый поток записывает только в одно особое место, и, по-видимому, массив читается только после присоединения всех потоков (в противном случае это очевидная проблема), которые утверждают неверно. Не существует условий гонки, и программа совершенно верна. Создание потоков и объединение потоков в обоих случаях происходит до отношений с предыдущим кодом в задействованных потоках, поэтому ни одно из двух потоков не записывается в одно и то же место, и между ними нет чередующихся чтений и записи без синхронизации. – Voo

+0

Предпочитают использовать явно потокобезопасные классы для всех межпоточных связей. Кроме того, карта в любом случае является более чистой для этого варианта использования - вы сопоставляете потоки с значениями. – dimo414