在下面的代码中,由于多线程并行的原因,可能主线程的耗时计算早就执行完了,而上面的线程还在打印,因此不能正确计算耗时时间。
public class JavaDemo { public static void main(String[] args) throws ParseException { long begin = System.currentTimeMillis(); LatchDemo ld = new LatchDemo(); for (int i = 0; i < 5; i++) { new Thread(ld).start(); } long end = System.currentTimeMillis(); System.out.println("耗时:" + (end - begin)); } } class LatchDemo implements Runnable { @Override public void run() { for (int i = 0; i < 50000; i++) { System.out.println(i); } } }
引入闭锁机制,在指定个数的线程没执行完之前,不会继续执行后面的代码
public class JavaDemo { public static void main(String[] args) throws ParseException { CountDownLatch latch = new CountDownLatch(5); LatchDemo ld = new LatchDemo(latch); long begin = System.currentTimeMillis(); for (int i = 0; i < 5; i++) { new Thread(ld).start(); } //countdown为0之前将一直等待 try { latch.await(); } catch (InterruptedException e) { e.printStackTrace(); } long end = System.currentTimeMillis(); System.out.println("耗时:" + (end - begin)); } } class LatchDemo implements Runnable { private CountDownLatch latch; public LatchDemo(CountDownLatch latch) { this.latch = latch; } @Override public void run() { try { synchronized (this) { for (int i = 0; i < 50000; i++) { System.out.println(i); } } } finally { latch.countDown(); } } }
正确计算耗时,控制台打印
...... 49997 49998 49999 耗时:1262 Process finished with exit code 0