HashSet set = new HashSet();
while(it.hasNext()){
set.add(it.next());
}
it = set.iterator();
while(it.hasNext()){
list.add(it.next());
}
或者是
package hddqcs.datamining.venus.venusfile;
import hddqcs.datamining.venus.common.DMLogger;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import org.apache.log4j.Logger;
/**
*
* COPYRIGHT(C) Hitachi Global Storage Technologies, Inc.
* All Rights Reserved.
*
* This Class is to reading the process config file
*
* eg. etl_venusProcess.properties
*
* @author liuqact
*/
public class ReadingProcessProsFile {
Logger logger = Logger.getLogger(ReadingProcessProsFile.class.getName());
public Properties getProperties(String dir,String fileName)throws FileNotFoundException,IOException,Exception {
// TODO Auto-generated method stub
try{
Properties pros = new Properties();
InputStream prosFile = new FileInputStream("Log4j.properties");
pros.load(prosFile);
return pros;
}catch(FileNotFoundException e){
logger.error("Properties file inputted is not exist");
throw e;
}catch(IOException e){
logger.error("Reading Properties file inputted failed");
throw e;
}catch(Exception e){
logger.error("get values from Properties file inputted failed");
throw e;
}
}
}
http://sourceforge.net/projects/jexcelapi
JExcelApi is a java library which provides the ability to read, write, and modify
Microsoft Excel spreadsheets. This project mirrors the files on http://www.jexcelapi.org,
which has been known to go down on occasion.
http://sourceforge.net/projects/excelutils
ExcelUtils, easy export report in excel by excelutils.It like velocity or freemarker, but
it's script is written in excel to control excel format and data.
1. Eclipse插件之Bytecode Outline
本文介绍如何利用Eclipse插件Bytecode Outline在Eclipse中的操作使用。
Eclipse是目前非常流行的开发平台,开放扩展的架构让很多程序员找到了自己个性化的工作环境。
原文出处: http://dev2dev.bea.com.cn/bbsdoc/20060123182.html
2 Eclipse插件之Implementors
本文介绍如何利用Eclipse插件Implementors在Eclipse中的使用。
Eclipse是目前非常流行的开发平台,开放扩展的架构让很多程序员找到了自己个性化的工作环境。
问题提出:
如果你想看看某个类或者方法的实现,一般是Ctrl + 鼠标左键,单击即可以打开这个类或者方法的具体实现代码。但是如果碰到接口时,只是到达接口而已,不能到达具体的实现类里。
解决方法:利用Eclipse的Implementors插件。
当追踪方法代码时,Eclipse默认是转到方法的接口类,而接口中是只有方法名称没有具体的实现代码,此插件提供了追踪到具体实现类的实现代码的功能。
详细信息参考: http://dev2dev.bea.com.cn/bbsdoc/20060124188.html
3 利用Eclipse开发Hibernate应用程序 --Hibernate Synchronizer插件
介绍如何利用Hibernate Synchronizer插件在Eclipse 3.0.1中快速的开发Hibernate应用程序,提高我们的工作效率。
本文介绍如何利用Eclipse插件EasyExplorer在Eclipse中的使用。
Eclipse是目前非常流行的开发平台,开放扩展的架构让很多程序员找到了自己个性化的工作环境,Hibernate也是目前很流行的O/R Mapping框架,至少在EJB 3.0大行其道之前,它是我们在考虑O/R Mapping时非常好的选择。
关于Hibernate框架的细节,请参考《Hibernate in Action》一书。
详细内容点击这里: http://dev2dev.bea.com.cn/bbsdoc/20060124187.html
4 Eclipse插件之EasyExplorer
Eclipse是目前非常流行的开发平台,开放扩展的架构让很多程序员找到了自己个性化的工作环境。
问题提出:
如果你经常需要在Eclipse里打开相关资源文件所在的文件夹,比较麻烦,要右键,属性,在Location一栏中把所在的文件夹拷贝一下,然后再去资源管理器里输入这个路径,回车,打开它。
详细内容点击这里 ; http://dev2dev.bea.com.cn/bbsdoc/20060124184.html
5 Eclipse插件之SQLExplorer
本文介绍如何利用Eclipse插件SQLExplorer在Eclipse中连接各种数据库进行操作使用。
详细内容点击这里 http://dev2dev.bea.com.cn/bbsdoc/20060126189.html
6 Eclipse插件之FindBugs
本文介绍如何利用Eclipse插件FindBugs在Eclipse中的使用。
Eclipse是目前非常流行的开发平台,开放扩展的架构让很多程序员找到了自己个性化的工作环境。
问题提出:
当我们编写完代码,做完单元测试等各种测试后就提交正式运行,只能由运行的系统来检测我们代码是否有问题了,代码中隐藏的错误在系统运行的过程中被发现后,然后再来进行相应的修改,那么后期修改的代价就相当高了。
在多线程大师Doug Lea的贡献下,在JDK1.5中加入了许多对并发特性的支持,例如:线程池。这里介绍的就是1.5种的线程池的简单使用方法。 |
一、简介
线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为:ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime, TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler)
- corePoolSize
线程池维护线程的最少数量- maximumPoolSiz
线程池维护线程的最大数量- keepAliveTime
线程池维护线程所允许的空闲时间- unit
线程池维护线程所允许的空闲时间的单位- workQueue
线程池所使用的缓冲队列- handler
线程池对拒绝任务的处理策略一个任务通过 execute(Runnable)方法被添加到线程池,任务就是一个 Runnable类型的对象,任务的执行方法就是 Runnable类型对象的run()方法。
当一个任务通过execute(Runnable)方法欲添加到线程池时:也就是:处理任务的优先级为:
- 如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。
- 如果此时线程池中的数量等于 corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。
- 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。
- 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务。
核心线程corePoolSize、任务队列workQueue、最大线程maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。
当线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。
unit可选的参数为java.util.concurrent.TimeUnit中的几个静态属性:
NANOSECONDS、MICROSECONDS、MILLISECONDS、SECONDS。
workQueue我常用的是:java.util.concurrent.ArrayBlockingQueue
handler有四个选择:
- ThreadPoolExecutor.AbortPolicy()
抛出java.util.concurrent.RejectedExecutionException异常- ThreadPoolExecutor.CallerRunsPolicy()
重试添加当前的任务,他会自动重复调用execute()方法- ThreadPoolExecutor.DiscardOldestPolicy()
抛弃旧的任务- ThreadPoolExecutor.DiscardPolicy()
抛弃当前的任务
二、一般用法举例 [下载源代码]
package cn.simplelife.exercise;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class TestThreadPool {
private static int produceTaskSleepTime = 2;
public static void main(String[] args) {
//构造一个线程池
ThreadPoolExecutor producerPool = new ThreadPoolExecutor(2, 4, 0,
TimeUnit.SECONDS , new ArrayBlockingQueue(3),
new ThreadPoolExecutor.DiscardOldestPolicy());
//每隔produceTaskSleepTime的时间向线程池派送一个任务。
int i=1;
while(true){
try {
Thread.sleep(produceTaskSleepTime);
String task = "task@ " + i;
System.out.println("put " + task);
producerPool.execute(new ThreadPoolTask(task));
i++;
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
package cn.simplelife.exercise;
import java.io.Serializable;
/**
* 线程池执行的任务
* @author hdpan
*/
public class ThreadPoolTask implements Runnable,Serializable{
//JDK1.5中,每个实现Serializable接口的类都推荐声明这样的一个ID
private static final long serialVersionUID = 0;
private static int consumeTaskSleepTime = 2000;
private Object threadPoolTaskData;
ThreadPoolTask(Object tasks){
this.threadPoolTaskData = tasks;
}
//每个任务的执行过程,现在是什么都没做,除了print和sleep,:)
public void run(){
System.out.println("start .."+threadPoolTaskData);
try {
//便于观察现象,等待一段时间
Thread.sleep(consumeTaskSleepTime);
} catch (Exception e) {
e.printStackTrace();
}
threadPoolTaskData = null;
}
}
对这两段程序的说明:
public static ArrayList<LinkedHashMap> delRes(String sql) {
ArrayList<LinkedHashMap> list = new ArrayList<LinkedHashMap>();
Connection con = null;
PreparedStatement stmt = null;
ResultSetMetaData metaData=null;
try {
con = ConDB.getCon();
stmt = (PreparedStatement) con.prepareStatement(sql);
ResultSet result = stmt.executeQuery();
metaData=result.getMetaData();
while (result.next()) {
LinkedHashMap v = new LinkedHashMap();
for (int i = 1; i <= metaData.getColumnCount (); i++)
v.put(metaData.getColumnLabel(i),result.getObject(i));