2015-02-02 2 views
0

Я написал приложение, которое читает все строки в текстовых файлах и измеряет время. Я задаюсь вопросом, что будет временем всего блока. Например, если я начать 2 темы одновременно:Как проверить синхронизацию потоков?

for (int i = 0; i < 2; i++) { 
     t[i] = new Threads(args[j], 2); 
     j++; 
    } 

    try { 
     Thread.sleep(500); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    }  

    System.out.println("TIME for block 1 of threads; " 
      + (max(new long[]{t[0].getTime(),t[1].getTime()}))); 

ждать их, чтобы остановить обработку файлов и чтения операции (по GetTime). Хорошо ли для многопоточности думать, что в этом случае время блока потоков будет максимальным временем, полученным из потока? Я думаю, да, потому что другие потоки перестанут работать к тому времени, когда поток с максимальным временем остановится.

Или, может быть, я должен думать по-другому?

+0

System.currentTimeMillis(); вы можете попробовать это для общей стоимости – Prashant

+0

Да, я использовал его в своей теме. – Kris

+0

Вы получили то, что искали? – Prashant

ответ

1

Опасно спорить о порядке выполнения при наличии нескольких потоков! Например. Если вы запустите свой код на одном основном процессоре, потоки будут работать не параллельно, а последовательно, поэтому общее время выполнения для обоих потоков будет суммой времени выполнения каждого потока, а не максимального значения обоих.

К счастью, есть очень простой способ, чтобы просто измерить, если вы используете ExecutorService вместо непосредственного использования Thread с (. Кстати, это всегда хороший совет):

// 1. init executor 
int numberOfThreads = 2; // or any other number 
int numberOfTasks = numberOfThreads; // is this true in your case? 
ExecutorService executor = Executors.newFixedThreadPool(numberOfThreads); 

long startTime = System.currentTimeMillis(); 

// 2. execute tasks in parallel using executor 
for(int i = 0; i < numberOfTasks; i++) { 
    executor.execute(new Task()); // Task is your implementation of Runnable 
} 

// 3. initiate shutdown and wait until all tasks are finished 
executor.shutdown(); 
executor.awaitTermination(1, TimeUnit.MINUTES); // we won't wait forever 

// 4. measure time 
long delta = System.currentTimeMillis() - startTime; 

Теперь delta держит общее время работы ваших задач. Вы можете поиграть с numberOfThreads, чтобы узнать, дают ли более или менее потоки разные результаты.

Важное примечание. Чтение из файла не является потокобезопасным в Java, поэтому не разрешено делиться Reader или InputStream между потоками!

+0

Это и ответ затрагивает то, что я хотел знать! Спасибо вам за этот вклад и полезную ноту. Задача решена! – Kris

0

Что касается моей заботы Вы можете использовать статические методы класса System. Вы можете использовать его в начале блока и конца блока и вычесть более позднюю с более ранним временем. те:

System.currentTimeMillis(); // The current value of the system timer, in miliseconds. 

или

System.nanoTime(); //The current value of the system timer, in nanoseconds. 
0

Вы можете использовать Запуск блока

long startTime = System.currentTimeMillis();

Конец блока

long endTime = System.currentTimeMillis()- startTime; 

Под этим вы можете рассчитать.

Смежные вопросы