Loading

多线程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) + "毫秒");// 查看时间的变化
    }
}

运行结果:

posted @ 2020-12-21 15:14  文牧之  阅读(17)  评论(0)    收藏  举报  来源