我想检查多线程是否比单线程更快,然后我在这里做一个演示:
public class ThreadSpeedTest {
/**
* @param args
*/
public static void main(String[] args) {
System.out.println("cpu number:"
+ Runtime.getRuntime().availableProcessors());
singleThreadStart();
// secondThreadStart();
// fiveThreadStart();
}
private static void sum() {
long sum = 0;
for (int i = 0; i < 1000000; i++) {
sum += i;
}
System.out.println(sum);
}
private static void singleThreadStart() {
new Thread(new Runnable() {
public void run() {
long start = System.nanoTime();
// sum();
// sum();
// sum();
sum();
sum();
long end = System.nanoTime();
System.out.println("cost time:" + (end - start));
}
}).start();
}
private static void secondThreadStart() {
long start = System.nanoTime();
Thread thread1 = new Thread(new Runnable() {
public void run() {
sum();
}
});
thread1.start();
Thread thread2 = new Thread(new Runnable() {
public void run() {
sum();
}
});
thread2.start();
try {
thread1.join();
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
long end = System.nanoTime();
System.out.println("cost time:" + (end - start));
}
private static void fiveThreadStart() {
long start = System.nanoTime();
Thread thread1 = new Thread(new Runnable() {
public void run() {
sum();
}
});
thread1.start();
Thread thread2 = new Thread(new Runnable() {
public void run() {
sum();
}
});
thread2.start();
Thread thread3 = new Thread(new Runnable() {
public void run() {
sum();
}
});
thread3.start();
Thread thread4 = new Thread(new Runnable() {
public void run() {
sum();
}
});
thread4.start();
Thread thread5 = new Thread(new Runnable() {
public void run() {
sum();
}
});
thread5.start();
try {
thread1.join();
thread2.join();
thread3.join();
thread4.join();
thread5.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
long end = System.nanoTime();
System.out.println("cost time:" + (end - start));
}
}
首先我使用两个sum方法运行singleThreadStart,结果是
cpu number:4
499999500000
499999500000
cost time:6719000
然后我运行secondThreadStart,结果是
cpu number:4
499999500000
499999500000
cost time:14299000
然后我使用五个sum方法运行singleThreadStart,结果是
cpu number:4
499999500000
499999500000
499999500000
499999500000
499999500000
cost time:10416000
最后我运行fiveThreadStart,结果是
cpu number:4
499999500000
499999500000
499999500000
499999500000
499999500000
cost time:15708000
我的问题是:
1.SecondThreadStart比singleThreadStart花费更多的时间,是因为创建线程的成本?
2.尽管创建线程的成本很高,但cpu数是4,那么使用超过4个线程比使用4个线程慢吗?
3.如果我想做一些需要花费更多时间的事情,那么使用四个线程最好吗?
答案 0 :(得分:3)
答案 1 :(得分:3)
1.SecondThreadStart花费的时间比singleThreadStart多,是不是因为创建线程的成本?
当然,创建线程会产生开销。
2.尽管创建线程的成本很高,但是cpu数是4,所以使用超过4的线程数会比使用四个线程慢吗?
如果线程快速完成(非IO绑定和CPU绑定),即使线程数超过CPU核心数,也可以获得良好的结果。
3.如果我想花费很多时间做一些事情,最好使用四个线程吗?
您可以使用高级java并发类(newWorkStealingPool
)的Executors
请参阅此SE问题:
Java's Fork/Join vs ExecutorService - when to use which?
一般情况:
多线程可以通过使用更多CPU功率来提高应用程序的吞吐量。
这取决于很多因素。
如果您的应用程序
,多线程将提供出色的结果更少的CPU限制,更少的IO绑定(但仍然可以使用多线程这些应用程序)
无共享数据
如果没有,性能取决于上述因素,单线程应用程序和多线程应用程序之间的吞吐量会有所不同。
一些好的SE问题:
Does multithreading always yield better performance than single threading?
Why single thread is faster than multithreading in Java?
好文章: