java利用线程池优化程序

Posted ciscolee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java利用线程池优化程序相关的知识,希望对你有一定的参考价值。

1、提升程序加载速度

2、几种线程的创建方法

3、实用举例【这里实用线程池创建将要被实用的对象,然后被实用的类则实现call方法,返回该类对象】

技术图片
//v2.0新增利用线程创建,发现加载更快了
    {
        // 获取当前程序运行时对象
        Runtime run = Runtime.getRuntime();
        // 调用垃圾回收机制,以减少内存误差
        run.gc();
        // 获取当前JVM的空闲内存
        long freeMemory = run.freeMemory();
        // 系统当前时间
        long timePro = System.currentTimeMillis();
        ExecutorService service = Executors.newFixedThreadPool(2);
        // 线程池创建并执行1000个线程
        for (int i = 0; i < 1000; i++) {
            try {
                service.submit(new ReadConfigFile());
                
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        System.out.println("使用线程池创建1000个线程所需要占用的内存大小: "
                + (freeMemory - run.freeMemory()));
        // 线程池使用完成,关闭线程池
        service.shutdown();
        System.out.println("使用线程池创建并运行1000个线程需要的时间为: "
                + (System.currentTimeMillis() - timePro));

    
    }//线程池结束
View Code

以上代码service.submit(new ReadConfigFile());种的new ReadConfigFile()是我读取文件的类,在其中实现了call()方法,如下:

技术图片
package com.writer;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.concurrent.Callable;

//读取配置文件的类
public class ReadConfigFile implements Callable {
    File file = null;
    FileInputStream fis = null;
     BufferedInputStream bis = null;
    public ReadConfigFile() throws IOException{
        this.file  = new File("C:/menu.txt");
        this.fis = new FileInputStream(file);
        this.bis = new BufferedInputStream(fis);
    }
    
    public String[] getFileContent(){    
        try{
            long begin = System.currentTimeMillis();
             byte[] buffer = new byte[1024];
             String []result = null;
             int cnt = 0;
             while((cnt=bis.read(buffer)) != -1) {
                 String bluck = new String(buffer, 0, cnt);
                 result = bluck.split("
");//在windows中回车换行必须这样写
                 System.err.print(result[1]);
                }
                System.out.println("=====BufferIStream===== time: " + (System.currentTimeMillis() - begin) + "ms");
            return result;
        }catch(Exception e){
            System.err.print(e);
            return null;
        }finally{
            close();
        }        
    }
    public void close(){
        try {
            bis.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }


    public Object call() throws Exception {
        // TODO Auto-generated method stub
        return this;
    }
    //测试
    public static void main(String[] args) throws IOException {
        ReadConfigFile txt = new ReadConfigFile();
        String a[] = txt.getFileContent();
        for (int i=0;i<a.length;i++) {
            if(i%2!=0)
            System.out.print(a[i]);
        }

    }
}
View Code

注意:每次使用线程池创建的对象时,只需要调用被使用的类的get()方法获取对象,再使用方法即可。

我使用的是读取文档0,2,4,6...偶数行作为按钮的名称,1,3,5..奇数行作为执行路径,根据读取的配置动态创建按钮,及事件,该类略。

以上是关于java利用线程池优化程序的主要内容,如果未能解决你的问题,请参考以下文章

深入源码,深度解析Java 线程池的实现原理

遇见这么刁钻的面试题怎么办???Java怎么利用线程工厂监控线程池

深入源码分析Java线程池的实现原理

深入源码分析Java线程池的实现原理

newCacheThreadPool()newFixedThreadPool()newScheduledThreadPool()newSingleThreadExecutor()自定义线程池(代码片段

172SpringBoot2的一个利用CountDownLatch和线程池优化查询接口执行效率的例子