Java - 线程计算速度更慢

标签 java java-threads

我正在尝试更快地计算我的程序。但使用线程会使速度变慢。下面是简化后的代码:

在这个数组中,尝试对每个数字求和。 例如:个位数=3+6

List<String> myArr = new ArrayList<String>();
myArr.add("123");
myArr.add("456");

当这样计算时:

/* NORMAL USE */ 

long startTime1 = System.nanoTime();

int units=0; int tens=0; int hundreds=0;

for(int i=0; i < myArr.size(); i++) {
    units += Character.getNumericValue(myArr.get(i).charAt(2));
    tens += Character.getNumericValue(myArr.get(i).charAt(1));
    hundreds += Character.getNumericValue(myArr.get(i).charAt(0));
}

long endTime1 = System.nanoTime();
double estimatedTime1 = (endTime1 - startTime1)/1000000.0;

System.out.println(estimatedTime1 + " milliseconds");

输出:

0.0285 milliseconds

使用Thread计算时:

/* USING THREAD */ 

ExecutorService pool = Executors.newFixedThreadPool(3);

long startTime2 = System.nanoTime();

pool.execute(new UnitsDigit(myArr));
pool.execute(new TensDigit(myArr));
pool.execute(new HundredsDigit(myArr));

pool.shutdown();

long endTime2 = System.nanoTime();
double estimatedTime2 = (endTime2 - startTime2)/1000000.0;

System.out.println(estimatedTime2 + " milliseconds");

输出:

2.5015 milliseconds

我哪一部分做错了?线程应该更快。

最佳答案

一个典型的新手误解:使用多线程并不一定会导致执行速度更快!

线程最终由底层操作系统管理。因此,创建这样的线程会带来一定的开销!因此,仅当相应的“任务”具有一定的持续时间时,使用多个线程才有意义。除此之外,您还需要一个能够并行运行所有线程的 CPU,否则您将再次因使用单个线程执行计算工作而失败。

换句话说:在简单的计算上投入多个线程,只需要“相对较少”的毫秒或纳秒即可完成,从而实现更慢的执行时间!

最后:当线程花费大量时间等待某些事情发生(例如执行文件 io)时,多线程的真正好处就显现出来了。

因此:当您打算使用一个线程与多个线程进行有意义的实验时,您必须在定义设置时纳入这些细节。

关于Java - 线程计算速度更慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55983751/

相关文章:

android - 3个高频运行的线程使用相同的变量

java - IBM WAS 5.1/Tread 转储分析 : Servlet. Engine.Transports 卡在 java.net.SocketInputStream.socketRead0 上

java - JUnit MethodRule 只测试一行

java - 按钮 ng 下拉-如何使用 webdriver 和 java 选择项目

java - 我可以使用 java 将 cometd 主题中的流数据读取到 Apache Beam 中吗?

java - 网络线程与UI线程通信

java - wait() , notify() - 哪个线程首先解锁?

java - 如何使用 Selenium 在可点击下一个按钮的情况下逐一解析网页?

Java错误: bad operand types for binary operator in HashMap

Java函数在执行之前返回一个值