在Java ThreadPoolExecutor线程死亡上执行资源解放操作

时间:2014-06-18 16:25:42

标签: java multithreading activejdbc

我有一个Java ThreadPool,初始化如下:

ThreadFactory tFactory = new DatabaseWorkerThreadFactory();
final ExecutorService dbService = new ThreadPoolExecutor(1, 5, 10L, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10), tFactory);

然后像这样

在该线程池上执行Runnable Task
executorService.execute(new RunnableDbInsertTask(netData));

让这些插入与我的其余代码保持异步。

由于我使用ActiveJDBC作为ActiveRecord实现,我需要每个工作者都有一个活动的Connection,我在RunnableDbInsertTask的{​​{1}}方法的开头有这个代码:< / p>

run()

因此,当使用if(!Base.hasConnection()) Base.open(params); 时,每个获得任务的新生成ThreadPoolExecutor将具有唯一的连接,并将为每个连接重复使用它。

现在我希望线程数量回退到最小值(1),如Thread构造函数中指定的那样,当没有要完成的任务时。

为了正确发生这种情况,我需要当ThreadPoolExecutor's由于不活动而自动完成一个线程时,它会自动完成调用ActiveJDBC的ThreadPoolExecutor方法的连接

作为一种解决方案,我尝试重写Base.close()方法,但这没有用。

任何帮助表示赞赏。谢谢!

1 个答案:

答案 0 :(得分:1)

我认为您不应该依赖执行程序来打开和关闭您的连接。您需要使用连接池并从池中打开连接,而不是打开与数据库的直接连接。此外,在run()方法的末尾,您必须关闭连接。由于这些是轮询连接,因此真正的JDBC连接将简单地返回池而不是关闭。这是preudo代码:

public void run() {        
    try {
        Base.open("myConnectionJNDIName");
        //do some real work here
    } finally {
        Base.close();//always close connection
    }
}

通过这种方式,您可以更好地控制线程数与连接数。