Reputation: 113
I want to check whether multithreading is faster than single thread,then I make a demo here:
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));
}
}
First I run singleThreadStart with two sum method,the result is
cpu number:4
499999500000
499999500000
cost time:6719000
Then I run secondThreadStart,the result is
cpu number:4
499999500000
499999500000
cost time:14299000
Then I run singleThreadStart with five sum method,the result is
cpu number:4
499999500000
499999500000
499999500000
499999500000
499999500000
cost time:10416000
Finally I run fiveThreadStart,the result is
cpu number:4
499999500000
499999500000
499999500000
499999500000
499999500000
cost time:15708000
My questions are:
Upvotes: 7
Views: 13838
Reputation: 38910
1.SecondThreadStart cost more time than singleThreadStart, is it because the cost of creating thread?
Certainly there is overhead with creation of thread.
2.The cpu number is 4, despite the cost of creating thread, so using thread number more than 4 will slower than using four threads?
If the threads are finishing very quickly ( Not IO bound and CPU bound), you can have good results even if number of threads are more than number of CPU cores.
3.If I want to do something cost much time, using four threads to do is best?
You can use advanced java concurrent classes ( newWorkStealingPool
of Executors
)
Refer to this SE question:
Java's Fork/Join vs ExecutorService - when to use which?
In General:
Multi threading may improve throughput of the application by using more CPU power.
it depends on a lot of factors.
Multi threading will provide excellent results if your application is
Less CPU bound, less IO Bound ( But still multi-threading can be used for these applications)
No shared data
If not, the performance depends on above factors and throughput will vary between single threaded application and multi-threading application.
Some good SE questions:
Does multithreading always yield better performance than single threading?
Why single thread is faster than multithreading in Java?
Good articles:
thetechsolo.wordpress.com article
java-performance article
Upvotes: 5
Reputation: 682
Upvotes: 4