多线程Demo学习(使用线程池优化多线程编程,Object线程相关的方法)
一.使用线程池的优势
Java中的对象是使用new操作符创建的,如果用new创建大量短生命周期的对象,这种方式性能非常低下。所以为了解决这个问题一些先行者们发明了池技术。 例如对于数据库连接有连接池,一样的对于线程有线程池。 线程池可以极大的简便我们的多线程编程,在需要大量线程的程序编程时,它不仅从编程上简化了,而且性能比new要好。
下面我们这个Demo展示了new和线程池方式创建并允许线程的性能:
任务类:
public class TempThread implements Runnable {
// 测试用的Runnable接口实现类
private int id = 0;
@Override
public void run() {
// run()方法给id做自增运算
id++;
}
}
主类:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolTest {
public static void main(String[] args) {
Runtime run = Runtime.getRuntime();// 创建Runtime对象
//不使用线程池创建1000个对象需要的开销
//*******************************************************************************************************************************************
run.gc();// 运行垃圾回收器,这样可以减少误差
long freeMemory = run.freeMemory();// 获得当前虚拟机的空闲内存
long currentTime = System.currentTimeMillis();// 获得当前虚拟机的时间
for (int i = 0; i < 10000; i++) {
// 独立运行1000个线程
new Thread(new TempThread()).start();
}
System.out.println("独立运行1000个线程所占用的内存:" + (freeMemory - run.freeMemory()) + "字节");// 查看内存的变化
System.out.println("独立创建1000个线程所消耗的时间:" + (System.currentTimeMillis() - currentTime) + "毫秒");// 查看时间的变化
//使用线程池技术创建并运行1000个线程需要的开销
//************************************************************************************************************************************************
run.gc();// 运行垃圾回收器
freeMemory = run.freeMemory();// 获得当前虚拟机的空闲内存
currentTime = System.currentTimeMillis();// 获得当前虚拟机的时间
ExecutorService executorService = Executors.newFixedThreadPool(2);// 创建线程池
for (int i = 0; i < 1000; i++) {
// 使用线程池运行1000个线程
executorService.submit(new TempThread());
}
System.out.println("使用连接池运行1000个线程所占用的内存:" + (freeMemory - run.freeMemory()) + "字节");// 查看内存的变化
System.out.println("使用连接池创建1000个线程所消耗的时间:" + (System.currentTimeMillis() - currentTime) + "毫秒");// 查看时间的变化
}
}
运行结果:

浙公网安备 33010602011771号