【发布时间】:2020-03-18 12:18:12
【问题描述】:
我试图找出这个问题的解决方案,但在 StackOverflow 上找不到?
我只是想知道为什么我的多线程工作如此缓慢,事实上它应该做得相反。
public class Prime {
static BufferedWriter writer;
static DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
public static void main(String[] args) throws IOException {
System.out.println("Without Thread" + findPrime() + " ms");
System.out.println("With thread : " + findPrimeWithThreads() + " ms");
}
public static long findPrimeWithThreads() {
Instant start = Instant.now();
int primaryNumber = 3;
while (primaryNumber <= 100000) {
int finalPrimaryNumber = primaryNumber;
new Thread(() -> {
multiplicationHelper(finalPrimaryNumber);
}).start();
new Thread(() -> {
multiplicationHelper(finalPrimaryNumber+1);
}).start();
primaryNumber+=2;
}
return Duration.between(start, Instant.now()).toMillis();
}
public static long findPrime() throws IOException {
Instant instant = Instant.now();
int primaryNumber = 3;
while (primaryNumber <= 100000) {
multiplicationHelper(primaryNumber);
primaryNumber++;
}
return Duration.between(instant, Instant.now()).toMillis();
}
public static void multiplicationHelper(int primaryNumber){
int j = 2;
boolean isPrime = true;
while (j <= primaryNumber/2) {
if (primaryNumber % j == 0) {
isPrime = false;
break;
}
j++;
}
if (isPrime) {
// System.out.println("PRIME :: " + primaryNumber);
}
}
}
这是代码,代码的输出是:
Without Thread497 ms
With thread : 22592 ms
请您详细说明为什么会这样以及如何提高多线程的性能? 我是多线程编程的新手,所以我在这方面做错了吗?
【问题讨论】:
-
不要在每次迭代时都启动新线程!
-
创建一个新线程比执行操作本身花费的时间更长。您应该创建一个线程池并重用这些线程。或者,您可以创建几个线程并为它们分配部分工作负载。
-
Java 中的多线程新手?您需要快速了解这个 Java 教程主题:Concurrency。
标签: java multithreading primes