当前位置: 首页 > 知识库问答 >
问题:

多线程Java应用程序执行时间的测量

姜俊友
2023-03-14

我搜索了关于测量Java应用程序执行时间的信息,得到了以下代码:

long start= System.currentTimeMillis();
//TODO
long stop= System.currentTimeMillis();

开始和停止之间的差异给了我执行时间。

注意:我知道这不是确切的执行时间。我只是需要多线程和单线程应用程序之间的比较的时间。

如果我这样更改代码会怎样:

long start= System.currentTimeMillis();
//something...
Thread t1= new Thread(new blabla(0, 10), "T - 1");
t1.start();
Thread t2= new Thread(new blabla(10, 20), "T - 2");
t2.start();
//Consider I've 10 threads like this
//something more
long stop = System.currentTimeMillis();

执行10个线程。不管他们做什么。假设他们随机填充一个二维数组。

现在,stop-start给了我“全部”执行时间?或者我必须自己测量线程吗?

共有1个答案

武卓
2023-03-14

您的多线程示例将无法按预期的方式工作,因为当您在线程上调用start()时,它将并发运行。所以基本上发生的是启动所有10个线程,可能在调用之前没有一个线程真正开始工作

long stop = System.currentTimeMillis();

如果您想要测量完成任务所需的完整运行时,您必须等待所有线程首先完成,您可以这样做:

long start = System.currentTimeMillis();

List<Thread> threads = new ArrayList<>();

for (int i = 0; i < 10; ++i) {
    Thread t = new Thread(new blabla(i * 10, (i + 1) * 10), "T - " + (i + 1));
    t.start();
    threads.add(t);
}

// and now wait for all of them to complete
for (Thread t : threads) {
    t.join();
}

long stop = System.currentTimeMillis();

请注意,只有当线程在执行后终止(即blablarunnable不在无休止循环中运行)时,这才起作用。

或者,您可以使用ExecutorService(例如Executors.NewFixedThreadPool(10),参见Java API),您可以向其提交任务并等待所有任务的终止。

 类似资料:
  • 问题内容: 有没有一种简单的方法可以测量由JDBC执行的所有sql语句的执行时间,并将结果打印到输出中? 有人可能建议我使用AOP来做到这一点,但我尝试尽可能避免这种情况。还有另一种方法吗? 问题答案: 如果不在提供数据源的应用程序服务器中运行该应用程序,则将发现log4jdbc项目很有用。项目提供的记录器将允许您记录所执行的SQL语句的执行情况。 通过将从DataSource返回的连接包装在Co

  • 问题内容: 我正在用javaFx编写天气应用程序,以从openweather.org获取数据。从openweather获取JSON的整个代码运行良好,也可以将JSON数据转换为对象。我用lambda表达式来实现在。问题是:如果我运行Main class,请按按钮,该应用程序将挂起。导入数据的线程有效(在控制台上通过2次打印检查),主线程“跳过” 并在控制台上打印某些内容。我不确定这里出什么问题了。

  • 这是一个关于Java中多线程的初学者问题。 根据我的理解,当创建多个(用户)线程来运行程序或应用程序时,就没有父线程和子线程的概念。它们都是独立的用户线程。 因此,如果主线程完成执行,那么另一个线程(Thread2)仍将继续执行,因为在Thread2的执行线程完成之前,它不会被JVM杀死(https://docs.oracle.com/javase/6/docs/api/java/lang/Thr

  • 问题内容: 我尝试从一本书(Paul Hyde,Java Thread Programming)中运行示例。它说线程的顺序将互换。但是我总是得到:之后打印10个“主线程”,然后打印10个“新线程”。更有趣的是:如果我将使用tt.run而不是tt.start,那么结果将相反。也许这本书太老了,示例基于JDK 1.2的原因???代码如下: 问题答案: JVM决定何时将控制权从主线程转移到第二个线程。由

  • 问题内容: 通过阅读本文,我知道每个Java应用程序都将在特定的Java虚拟机实例中运行。因此,如果我执行以下命令(“ Java -jar test1.jar”,“ Java -jar test2.jar”),我将在系统中获得两个进程。并且,如果每个命令都使用默认堆大小,例如256M。总内存成本为512M,对吗?还有其他问题: Java虚拟机是一个守护进程,由系统启动吗? 当我执行“ java -

  • 我正在开发一个java应用程序,其中我使用java swing窗体和javafx FXML stage,我对javafx是新手,现在我在应用程序中调用具有控制器的javafx FXML stage,从swing窗体调用FXML stage,单击如下按钮----application.launch(myfxml.class); 下面的代码片段用于调用swing表单-- 我得到的异常是“应用程序启动必