直接粘代码,如下:
package com.example.demo.test.threadPoolTest;
import com.example.demo.Entity.User;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
/**
* 本示例有一个疑点:多线程到底什么情况下不仅不会提高效率,反而导致代码的执行效率下降?
* runWithoutThread方法在单线程条件下向list集合添加10,000,000条数据,一般用时在8-9s左右,
* 但开启多线程之后,执行所用的时间反而增加为11-14s左右,这种情况目前还没有找到原因
*/
public class ThreadTest02 {
public static void main(String[] args) {
runWithThread();
runWithoutThread();
}
private static void runWithThread() {
ThreadPoolExecutor thisPool = new ThreadPoolExecutor(10, 20,
0, TimeUnit.SECONDS, new ArrayBlockingQueue<>(10));
ReentrantLock lock = new ReentrantLock();
List list = new ArrayList<>(10000000);
Long startTime = System.currentTimeMillis();
for (int i = 0; i < 10; i++) {
thisPool.execute(() -> {
while (true) {
if (list.size() < 10000000) {
User user = new User(Thread.currentThread().getName() + String.valueOf(Math.random()));
lock.lock();
if (list.size() < 10000000) {
list.add(user);
}
lock.unlock();
} else {
break;
}
}
});
}
while (true) {
if (thisPool.getActiveCount() == 0) {
Long endTime = System.currentTimeMillis();
System.out.println("线程池并发运行用时" + (endTime - startTime));
// System.out.println(list.size());
break;
}
}
}
private static void runWithoutThread() {
Long startTime = System.currentTimeMillis();
List<User> list = new ArrayList<>(10000000);
while (true) {
if (list.size() < 10000000) {
User user = new User(Thread.currentThread().getName() + String.valueOf(Math.random()));
if (list.size() < 10000000) {
list.add(user);
}
} else {
break;
}
}
Long endTime = System.currentTimeMillis();
System.out.println("单线程运行用时" + (endTime - startTime));
}
}
运行结果:
线程池并发运行用时12924
单线程运行用时9583
其实对多线程的理解也不是很深,就有限的知识来理解一下。在应用程序中利用多线程很多情况下是不阻塞当前的应用线程,在主线程以外开辟新线程来实现这个业务逻辑,同时为了增加一些效率,从而有了线程池这种池化的概念。但使用了多线程就一定能提高程序的执行效率,这是不科学的。所以还是结合一些实际案例和场景来探讨。