java利用线程池优化程序
Posted ciscolee
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java利用线程池优化程序相关的知识,希望对你有一定的参考价值。
1、提升程序加载速度
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)); }//线程池结束
以上代码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]); } } }
注意:每次使用线程池创建的对象时,只需要调用被使用的类的get()方法获取对象,再使用方法即可。
我使用的是读取文档0,2,4,6...偶数行作为按钮的名称,1,3,5..奇数行作为执行路径,根据读取的配置动态创建按钮,及事件,该类略。
以上是关于java利用线程池优化程序的主要内容,如果未能解决你的问题,请参考以下文章
遇见这么刁钻的面试题怎么办???Java怎么利用线程工厂监控线程池
newCacheThreadPool()newFixedThreadPool()newScheduledThreadPool()newSingleThreadExecutor()自定义线程池(代码片段