论坛首页 Java企业应用论坛

线程池示例代码,请大家多指教

浏览 25523 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (13)
作者 正文
   发表时间:2009-08-25  
package com.shy.sql;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Enumeration;
import java.util.Hashtable;

public class QConnectionPool {
	private Hashtable connections;// 连接列表
	private int increment;// 连接增长量
	private String dbURL;// 数据库连接url
	private String user;
	private String password;
	private String diverClassName;// 驱动名称
	/**
	 * 构造方法
	 * 
	 * @param dbURL
	 *            数据库连接url
	 * @param user
	 *            用户名
	 * @param password
	 *            密码
	 * @param driverClassName
	 *            驱动名称
	 * @param initialConnections
	 *            初始连接数
	 * @param increment
	 *            增加数
	 * @throws SQLException
	 * @throws ClassNotFoundException
	 */
	public QConnectionPool(String dbURL, String user, String password,
			String driverClassName, int initialConnections, int increment)
			throws SQLException, ClassNotFoundException {
		Class.forName(driverClassName);
		this.dbURL = dbURL;
		this.user = user;
		this.password = password;
		this.increment = increment;
		connections = new Hashtable();
		for (int i = 0; i < initialConnections; i++) {
			connections.put(DriverManager.getConnection(dbURL, user, password),
					false);
		}
	}

	/**
	 * 从连接池返回一个Connection
	 * @return
	 * @throws SQLException
	 */
	public Connection getConnection() throws SQLException {
		Connection conn = null;
		Enumeration conns = connections.keys();
		synchronized (connections) {
			while (conns.hasMoreElements()) {
				conn = (Connection) conns.nextElement();
				Boolean b = (Boolean) connections.get(conn);
				//如果是不使用的连接,使其使用
				if (b == Boolean.FALSE) {
					try {
						conn.setAutoCommit(true);
					} catch (SQLException e) {
						connections.remove(conn);
						conn = DriverManager.getConnection(dbURL, user,
								password);
					}
					// 更新Hashtable
					connections.put(conn, Boolean.TRUE);

					return conn;
				}
			}
		}

		//如果没有空闲的连接,增加连接数
		for (int i = 0; i < increment; i++) {
			connections.put(DriverManager.getConnection(dbURL, user, password),
					Boolean.TRUE);
		}
		return getConnection();
	}
	
	/**
	 * 由连接池客户用来向连接池返回一个Connection
	 */
	public void returnConnection(Connection returned){
		if(connections.containsKey(returned)) {
			connections.put(returned, Boolean.FALSE);
		}
	}
}


共享一个自己的,呵呵!
0 请登录后投票
   发表时间:2009-08-25  
楼上用的啥数据库,为什么自己做个ConnectionPool??
0 请登录后投票
   发表时间:2009-08-26  
别整那么多SLEEP,wait下,合适的机会notify.SLeep不好.
0 请登录后投票
   发表时间:2009-08-31  
zhang_jie439 写道
import java.util.*;

public class ThreadPool {
	private LinkedList<Runnable> taskList = null;
	private boolean closed = false;

	public ThreadPool() {
		this.taskList = new LinkedList<Runnable>();
		for (int i = 0; i < 4; i++) {
			Thread work = new WorkThread();
			work.setDaemon(true);
			work.start();
		}
	}

	public synchronized void addTask(Runnable task) {
		if (closed)
			return;
		if (null == task)
			return;
		this.taskList.add(task);
		notify();
	}

	private synchronized Runnable getTask() {
		while (this.taskList.size() == 0) {
			try {
				if (closed)	return null;
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		return this.taskList.removeFirst();
	}

	public void close() {
		synchronized (this) {
			this.closed = true;
		}

	}

	private class WorkThread extends Thread {
		public void run() {
			while (true) {
				Runnable task = null;
				task = getTask();
				if (null == task)
					return;
				task.run();
			}
		}
	}
}



哥们,这个多少年前就存在吧!!!!
0 请登录后投票
   发表时间:2009-08-31  
如果你用是ssh在添加spring ,hibernate ,struts你就可以建连接池。
0 请登录后投票
   发表时间:2009-08-31  
yangke_love 写道
JDK5.0中有相关的线程管理内容,你可以参考下Think In Java 第四版

是这样的,Thinking In Java写的很详细了
0 请登录后投票
   发表时间:2009-09-05  
贴大段的代码。实在是懒得看。建议:把UML 时序图,活动图,类图。
设计清晰一目了然。细节的实现。就是 技术人员 本身素质的问题了。

还有一点。的确如楼上所说。Think In Java 第四版
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics